共计 1205 个字符,预计需要花费 4 分钟才能阅读完成。
angular2 控制视图的封装模式
为什么我想要分享控制视图的封装模式呢?主要是我们 angular 的项目大多数都会去引入一个 UI 组件,但往往因为需求和关系我们会去修改 UI 组件的样式。这时,因为有些人不是很了解 View encapsulation 里面的属性,往往会直接在全局的 style.js 里面添加全局样式,等项目越来越大,就会出现一些不知名的 bug 和维护起来变得困难。如果你运用好视图的封装模式,会帮你解决好很多的问题。一般来说组件的 CSS 样式被封装进了自己的视图中,而不会影响到应用程序的其它部分。通过在组件的元数据上设置视图封装模式,你可以分别控制每个组件的封装模式。Angular2 有三种样式封装模式:
ViewEncapsulation.Native – 使用原生的 Shadow Dom。
ViewEncapsulation.Emulated – angular2 的默认值,通过预处理(并改名)CSS 代码来模拟 Shadow DOM 的行为,在标签上增加标识,来固定样式的作用域,以达到把 CSS 样式局限在组件视图中的目的。
ViewEncapsulation.None – 没有 Shadow Dom,样式没有封装,Angular 会把 CSS 添加到全局样式中。而不会应用上前面讨论过的那些作用域规则、隔离和保护等。从本质上来说,这跟把组件的样式直接放进 HTML 是一样的。
在 ViewEncapsulation.Emulated 下 的 Angular 应用的 DOM 树中,每个 DOM 元素都被加上了一些额外的属性。
<hero-details _nghost-pmm-5>
<h2 _ngcontent-pmm-5>Mister Fantastic</h2>
<hero-team _ngcontent-pmm-5 _nghost-pmm-6>
<h3 _ngcontent-pmm-6>Team</h3>
</hero-team>
</hero-detail>
生成出的属性分为两种:
1、一个元素在原生封装方式下可能是 Shadow DOM 的宿主,在这里被自动添加上一个 _nghost 属性。这是组件宿主元素的典型情况。
2、组件视图中的每一个元素,都有一个 _ngcontent 属性,它会标记出该元素是哪个宿主的模拟 Shadow DOM。
用法如下:
import {Component, OnInit, ViewEncapsulation} from ‘@angular/core’;
@Component({
selector: ‘app-factor_analysi’,
templateUrl: ‘./factor_analysis.component.html’,
styleUrls: [‘./factor_analysis.component.scss’],
providers: [factor_analysis_api],
encapsulation: ViewEncapsulation.None
})