Стили компонентов не применяются при инкапсуляции эмулированного представления (Angular 5)

Я использую библиотеку PrimeNG (https://www.primefaces.org/primeng) в приложении Angular 5, и я понял, что, если я использую некоторые из ее элементов управления внутри компонента Angular с ViewEncapsulation.Emulated, я не могу применить к ним какой-либо пользовательский стиль.

Например, я использую элемент управления p-checkbox внутри компонента, и у меня есть следующие (ужасные) правила CSS в его файле стилей:

th {
  background-color: olive !important;
}

.ui-chkbox {
  background-color: aqua !important;
  height: 2.5rem !important;
}

ПРИМЕЧАНИЕ. ui-chkbox - это DIV, содержащий флажок.

Вот как это будет выглядеть, если я поставлю encapsulation: ViewEncapsulation.None:

Стили компонентов не применяются при инкапсуляции эмулированного представления (Angular 5)

Если я перейду на encapsulation: ViewEncapsulation.Emulated, это будет выглядеть так:

Стили компонентов не применяются при инкапсуляции эмулированного представления (Angular 5)

Как видите, тег компонента th все еще стилизован, а компонент флажка - нет. Я думал, что эмулированная инкапсуляция представления была предназначена для «изоляции» стилей компонентов, чтобы они не конфликтовали с другими, определенными снаружи, но похоже, что это также влияет на внутренние компоненты.

Может кто-нибудь объяснить такое поведение? Я прочитал пару руководств по инкапсуляции, но не смог найти причину.

Спасибо!

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
0
1 952
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не можете изменить стили компонентов Primeng без использования ViewEncapsulation.None.

The styles specified in @Component metadata apply only within the template of that component.

They are not inherited by any components nested within the template nor by any content projected into the component.

Вы можете настроить таргетинг только на основной элемент каждого дочернего компонента. Вы не сможете настроить таргетинг на какие-либо внутренние элементы, используемые внутри компонента.

Объем стиля

Ваш ответ помог мне лучше понять инкапсуляцию представления. Кроме того, читая документацию PrimeNG, я понял, что вы можете применить директиву styleClass к компоненту, чтобы помочь вам настроить его без переопределения глобальных стилей. Спасибо!

Fel 23.04.2018 16:21

Если вам нужно В самом деле, вы все равно можете использовать устарел::ng-deep для нацеливания на любой дочерний компонент:

:host ::ng-deep .ui-chkbox {
  background-color: aqua !important;
  height: 2.5rem !important;
}

Component styles normally apply only to the HTML in the component's own template.

Use the /deep/ shadow-piercing descendant combinator to force a style down through the child component tree into all the child component views. The /deep/ combinator works to any depth of nested components, and it applies to both the view children and content children of the component.

Подробнее см. https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep.

The shadow-piercing descendant combinator is deprecated and support is being removed from major browsers and tools. As such we plan to drop support in Angular (for all 3 of /deep/, >>> and ::ng-deep). Until then ::ng-deep should be preferred for a broader compatibility with the tools.

Спасибо за предложение. Но, как и Томаш, я стараюсь избегать использования устаревших решений. Чтобы настроить элемент управления флажком PrimeNG только внутри нужного мне компонента, я воспользуюсь его директивой styleClass, которая позволяет применить дополнительный класс, чтобы быть более конкретным в файле CSS. Например: <p-checkbox styleClass = "customCheckbox"> позволяет мне определять собственные стили с помощью селектора .customCheckbox.ui-chkbox.

Fel 23.04.2018 16:45

:: ng-deep по-прежнему является предпочтительным способом достижения команды Angular, если у вас есть вариант использования В самом деле для этого.

Kelvin Lai 24.04.2018 01:38

но похоже, что это не так, поскольку у вас есть альтернативы в библиотеке, которую вы используете!

Kelvin Lai 24.04.2018 01:46

это реальное решение. Отличная работа. огромное спасибо

Surya R Praveen 02.03.2021 13:24

Другие вопросы по теме