【问题标题】:Styles not applying on component level but on global level样式不适用于组件级别但适用于全局级别
【发布时间】:2018-09-06 18:29:04
【问题描述】:

我正在使用 ngPrime 组件,如果我为它们设置样式,则样式不会应用于 dashboard.component.sass 文件,但当我使用全局 style.sass 文件时它们会应用。

dashboard.component.html 文件

<p-dropdown [options]="reports" styleClass="report-dropdown">
      <ng-template let-item pTemplate="selectedItem">
        <i class="fas fa-th" style="fill: white;"></i>
        <span style="vertical-align:middle">
          {{item.label}}</span>
      </ng-template>
    </p-dropdown>

dashboard.component.scss 和全局 style.scss 文件

.report-dropdown {
  .ui-dropdown-label {
    background-color: $secondary;
    color: white;
  }
  .ui-dropdown-trigger {
    color: white;
    background-color: $secondary;
    border: none;
  }
}

【问题讨论】:

  • 查看 /deep/ 的 Angular 文档,以便您的样式可以达到深层嵌套组件
  • @ErvinLlojku 我没有将视图封装更改为无。因为它违背了视图封装本身的目的。我已经按照 primeNg 的建议在组件上添加了 styleClass,但它不适用于组件级别
  • 您无需更改封装级别即可使用/deep
  • dashboard.component.sass 是否包含在组件装饰器中?
  • @ErvinLlojku 是的。其他样式按预期工作。除了这些 ngPrime 组件

标签: angular primeng primeng-dropdowns


【解决方案1】:

如果要在组件中设置样式,只需在要应用的规则前使用ng-deep即可。

https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep

确实已弃用,但目前还没有替代品,所以你现在还是用它吧

dashboard.component.scss

::ng-deep .report-dropdown {
  .ui-dropdown-label {
    background-color: $secondary;
    color: white;
  }
  .ui-dropdown-trigger {
    color: white;
    background-color: $secondary;
    border: none;
  }
}

我不知道primeng,但我分叉了一个显示颜色变化的旧stackblitz(尽管示例中没有打开下拉菜单)

https://stackblitz.com/edit/primeng-bootstrap-ylpzwd?file=app/app.component.scss

其他解决方案

另一种解决方案是在全局样式表中设置样式。如果您的 CSS 规则比 ngPrime 默认应用的规则更具体,这将起作用

【讨论】:

  • 没有解释为什么会发生这个问题,第一个提供的解决方案已被弃用,因此使用它不是一个好主意,第二个解决方案是重复问题标题。所以我认为这不是这个问题的确切答案。
【解决方案2】:

默认情况下,Angular 组件样式的作用域是影响组件的视图。这意味着您编写的样式将影响组件模板中的所有元素。它们不会影响模板中其他组件的子元素。您可以在Angular documentation 中阅读有关视图封装的更多信息。

如果您的组件启用了视图封装(默认),您的组件样式只会影响模板中的顶级子级。除非您执行以下操作之一,否则属于子组件的 HTML 元素不能被您的组件样式定位:

  • (正如您已经提到的)将覆盖样式添加到您的全局样式表中。限定选择器,使其仅影响您需要的特定元素。
  • 在您的组件上关闭视图封装。如果您这样做,请务必适当地确定您的样式范围,否则您最终可能会无意中针对应用程序中其他地方的其他组件。
  • (不建议)使用已弃用的穿透阴影的后代组合器来强制将样式应用于所有子元素。在Angular documentation 中阅读有关此已弃用解决方案的更多信息。

【讨论】:

  • OP 正在使用primeng 组件,因此他无法控制封装。所以其他解决方案仍然存在:全局或或::ng-deep
猜你喜欢
  • 2023-03-13
  • 2016-04-07
  • 2019-08-04
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
相关资源
最近更新 更多