Все, что вам нужно сделать - это использовать селекторы псевдокласса :host
и ::ng-deep
в вашем компоненте X или Y.
Вот рабочая демонстрация .
А вот краткое объяснение.
Стили, которые написаны для <nextgen-table>
внутри, скажем, nextgen-table.component.css
, инкапсулируются angular путем добавления определенных c атрибутов для каждого стиля. т. е. если вы написали что-то вроде
.mat-header-cell{
background-color: #ff0000;
}
, тогда оно станет примерно таким:
.mat-header-cell[_ngcontent-c29]
background-color: #ff0000;
}
Так что все, что нам нужно сделать, это переопределить этот стиль внутри нашего компонента X или компонента Y .
У нас есть ::ng-deep
псевдоселектор, который не позволит angular инкапсулировать компоненты css.
Но использование ::ng-deep
приведет к утечке нашего css в родительские компоненты также. Таким образом, чтобы предотвратить это, нам нужно инкапсулировать стиль ::ng-deep
. для этого мы можем использовать :host
псевдоселектор.
, поэтому, если мы напишем следующее css внутри компонента X,
:host ::ng-deep .x-table .mat-header-cell{
background-color: lightblue;
}
, тогда оно станет примерно таким,
[_nghost-c82] .x-table .mat-header-cell {
background-color: lightblue;
}
теперь этот выбор css имеет более высокий приоритет, чем стиль, записанный в компоненте таблицы .mat-header-cell[_ngcontent-c29]
.
Вот так мы можем переопределить стиль дочернего компонента внутри любого родительского компонента. Я надеюсь, что это поможет.
Обновление: Как вы можете видеть в официальных документах Angular , что ::ng-deep
устарело.
Пронзающий теневой комбинатор не рекомендуется, и поддержка удаляется из основных браузеров и инструментов. Таким образом, мы планируем отказаться от поддержки в Angular (для всех 3 of / deep /, >>> и :: ng-deep). До тех пор :: ng-deep следует предпочитать для более широкой совместимости с инструментами.
Поэтому, если вы не хотите зависеть от ::ng-deep
than,
You можете использовать ViewEncapsulation.None
в компоненте таблицы <nextgen-table>
, который вы уже пробовали. Демонстрация здесь
И чтобы предотвратить утечку стиля в другие компоненты, вы можете ограничить стиль таблицы, добавив селектор перед всеми стилями, подобными этим.
nextgen-table .mat-header-cell{
background-color: #ff0000;
}
и затем вы делаете то же самое для своего компонента X.
- Отключить инкапсуляцию представления с помощью
ViewEncapsulation.None
- Затем переопределить стили для компонента таблицы, написав стили, которые имеют более высокую специфичность, чем фактический стиль таблицы.
отключите инкапсуляцию в стороне вашего компонента X,
@Component({
selector: "app-x",
styleUrls: ["x.component.css"],
templateUrl: "x.component.html",
encapsulation: ViewEncapsulation.None
})
export class XComponent {
}
, а затем переопределите стиль компонента таблицы в x.compoent.css
app-x nextgen-table .mat-header-cell{
background-color: lightblue;
}
Если вы не хотите отключать инкапсуляцию представления, тогда вы можете записывать стили непосредственно в глобальную таблицу стилей styles.css
.
Просто помните, что все дело в переопределении и ограничении ваших стилей.