Специфичные для платформы стили не наследуются от стиля компонента
У меня проблемы со стилями, когда в игру вступают CSS-файлы для конкретной платформы.
Смотрите файлы ниже:
items.component.ts:
@Component({
selector: 'ns-items',
moduleId: module.id,
template: `
<Label [nsRouterLink]="['/item', item.id]" [text]="item.name"
class="list-group-item"></Label>
`,
styleUrls: ['./items.component.css' ]
})
export class ItemsComponent implements OnInit {
items: Item[];
constructor(private itemService: ItemService) {
}
ngOnInit(): void {
this.items = this.itemService.getItems();
}
}
items.component.css:
Label {
background-color: blue;
}
items.component.ios.css:
Label {
background-color: red;
}
items.component.android.css пуст.
На iOS это ведет себя как ожидалось, Label
цвет фона красный. На Android Label
Цвет фона не изменился. Я ожидаю, что поведение наследует стили от items.component.css
, Итак Label
Цвет фона должен быть синим, а это не так.
Я пытался добавить @import items.component.css
в items.component.android.css
но потом я получаю Maximum call stack size exceeded
ошибка, потому что я объявляю CSS уже в компоненте.
Как правильно использовать компонент-глобальный CSS, а затем платформо-специфичные, которые наследуются от компонент-глобального? Или я что-то делаю не так?
1 ответ
Что должен означать компонент-глобальный? С ViewEncapsulation.Emulated (настройка по умолчанию) и.Native (браузер является родным способом сделать то же самое, что и эмулируется, но только немногие браузеры реализовали его; не использовать вообще!) Стили из вашего компонента применяются только к компоненту.
Ну, если вы не используете :host ::ng-deep
селекторы в вашем CSS, и в этом случае они также применяются к базовым дочерним компонентам. Но это не рекомендуется, потому что однажды эта функция будет устаревшей в Chrome, поэтому вместо этого вы должны использовать @Input() для передачи стилей / конфигураций базовым компонентам, если вам действительно это нужно.
Если вам нужны глобальные стили, вы можете объявить их в глобальной папке assets и включить их в angular-cli.json в качестве ресурсов.
Или вы можете установить ViewEncapsulation.None для одного конкретного компонента, стили которого будут проникать в остальную часть приложения. Я не рекомендую этот подход, так как это сбивает с толку, откуда берутся примененные глобальные стили, даже если вы делаете это в компоненте ядра, ответственном за тематику. Библиотека Google Angular-Material также не использует ViewEncapsulation.None.
TLDR: используйте только angular-cli.json для встраивания глобальных css-файлов.