欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解angular2 控制视图的封装模式

程序员文章站 2022-09-05 08:21:59
为什么我想要分享控制视图的封装模式呢?主要是我们angular的项目大多数都会去引入一个ui组件,但往往因为需求和关系我们会去修改ui组件的样式。这时,因为有些人不是很了解...

为什么我想要分享控制视图的封装模式呢?主要是我们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
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。