::ng-deep 更改其他组件样式

::ng-deep changes other components style

我正在使用 .md 文件在来自 Material 的 Angular 的对话框中显示信息。 问题是降价文件中的 tables,当它们显示在 DOM 中时,没有边框。所以我尝试添加一些 css.

::ng-deep table {
  border-collapse: collapse;
  border-spacing: 0;
  border:2px solid black;
}

::ng-deep th {
  border:2px solid black;
}

::ng-deep td {
  border:1px solid black;
}

如果不添加::ng-deep,我的table就没有样式,所以我不得不使用它。它工作正常,我的 table 现在有边框但是它影响了我的其他组件,如何解决这个问题?

编辑:这是我的模板:

<div markdown [src]="data"></div>

Answer is add parent class to dialog and use ::ng-deep to apply styles for that component only

您可以将 class 添加到对话框中,如下所示

const dialogRef = this.dialog.open(DialogOverviewExampleDialog, {
      width: '250px',
      data: {name: this.name, animal: this.animal},
      panelClass: 'my-parent-class'
});

并将样式添加为

.my-parent-class ::ng-deep table {
  border-collapse: collapse;
  border-spacing: 0;
  border:2px solid black;
}

.my-parent-class ::ng-deep th {
  border:2px solid black;
}

.my-parent-class ::ng-deep td {
  border:1px solid black;
}

说明:Material对话框是一个动态组件

静态组件HTML

<table _ngcontent-c0>...</table>

静态组件CSS

table[_ngcontent-c0] { ... }

动态分量HTML

<table>...</table>

动态分量CSS

table { ... }

注意静态组件属性 _ngcontent-c0 的区别由 angular 添加,Angular 使用此技术创建组件特定样式(为该特定组件应用样式),但是对于动态组件,没有添加任何属性。 这就是您的静态组件样式未应用于动态组件的原因

为了完成这项工作,我们在任何 class 之前使用 ::ng-deep 来删除该属性 _ngcontent-c0 和 select 动态组件,所以当 ::ng-deep 用于您的样式不再特定于组件(它将应用于所有组件)。 这就是我们使用父级 class 仅为该组件和动态创建的组件应用样式的原因也是。

希望我已经清楚地理解了您的问题。 如果您试图在不影响所有其他组件的情况下影响子组件的样式,请在 ::ng-deep 之前使用 :host。

:host ::ng-deep .my-class

这只会更改您更改样式的组件中的样式。