Тематика и стиль инкапсуляции - это две разные вещи.Angular будет только инкапсулировать код стиля в таблицу стилей вашего компонента;он не инкапсулирует какие-либо миксины, определенные там, потому что миксины должны быть вызваны для применения.И где вы определяете, что миксин не имеет ничего общего с тем, где этот миксин применяется - это ваше дело.Ваш класс ошибок доступен всему приложению, потому что вы назвали его в своей основной таблице стилей.
В конечном счете, вы не можете использовать их и инкапсулировать, потому что способ работы с темами распространяется на все приложения.Поэтому, чтобы обойти это, используйте селектор вашего компонента, чтобы ограничить область действия класса в вашем миксине:
@mixin my-component-theming($theme) {
// Extract whichever individual palettes you need from the theme.
$warn-palette: map-get($theme, warn);
$warn: mat-color($primary-palette);
my-component.error-message {
color: $warn !important;
}
}
Это по-прежнему определяет широкое применение стиля, но это повлияет только на ваш компонент.
Кроме того, вам не следует включать миксины тем оформления ваших компонентов в таблицы стилей компонентов.Они должны быть в их собственном файле тем, чтобы при импорте миксина для темы вы также не импортировали - в основную таблицу стилей приложения - какие-либо стили, не связанные с темой для компонента.
При этомВы можете попытаться инкапсулировать темы вашего компонента.Вам нужно будет получить доступ к своей глобальной теме в таблице стилей вашего компонента, и вам также может понадобиться импортировать утилиты тематического углового материала в вашу таблицу стилей компонента.Я не уверен, сработает ли это, и я думаю, что это может добавить много дублирования стилей в вашем приложении, если вы сделаете это для большого количества компонентов.