我正在尝试使用 styleUrls
属性来声明我的Angular 2组件以利用View Encapsulation但是在Angular完成初始化之后元素插入到DOM时似乎存在问题 .
我的情况是PrimeNG paginator,我目前可以通过Angular应用范围 .
请参见下文 <p-datatable>
元素有一个范围(它存在于原始标记中)但 <p-paginator>
没有(事后已添加到DOM) .
因此,Angular插入 HEAD
的样式与我的元素不匹配:
<style>
p-datatable[_ngcontent-xnm-4] p-paginator[_ngcontent-xnm-4]:not(:first-child) {
display: none;
}
</style>
这是Angular 2中视图封装的限制还是有办法让它按需“重新调整”DOM?
编辑错字和澄清 Headers
1 回答
正如您所注意到的那样,这是因为Shadow DOM和它提供的样式范围 . 您的模板仅包含正确获取作用域的
p-datatable
,但在事实之后添加的子元素不是作用域的 . 要应用自定义样式,您可以选择两种方法 .解决方案1 - 特殊选择器(推荐)
我个人推荐这个,因为你仍然可以维护视图封装(Shadow DOM) . 我们仍然可以使用
:host
和/deep/
selectors来定位使用PrimeNG的组件级模板这样做是通过子组件树向下强制样式到所有子组件视图中,因此即使
p-datatable
是组件自己的模板中存在的唯一标记,该样式仍将被应用,因为它是组件中的子组件 . DOM .解决方案2 - 禁用视图封装
在组件级别,您可以通过将View Encapsulation设置为ViewEncapsulation.None来禁用View Encapsulation