Примечание: я пробовал пример как в Angular 5, так и в Angular 6.
Проблема
При использовании 'encapsulation: ViewEncapsulation.None'
для углового компонента a <style>
элемент будет добавлен к <head>
при показе компонента.Элемент <style>
никогда не будет удален, даже после уничтожения компонента.Это проблема.Чем больше компонентов отображается, тем больше элементов <style>
в <head>
.В конечном итоге это вызывает конфликты, когда существуют глобальные правила CSS для того же элемента HTML, например body
, как в моем примере.Будет использоваться только CSS из последнего добавленного блока <style>
, даже если этот последний блок <style>
принадлежит компоненту, который больше не существует.
Я хотел бы увидеть правильное решение для удаления из DOM элемента <style>
, который поставляется вместе с некоторым компонентом.Например, очистка при срабатывании функции onDestoy
из компонента.
Я новичок в Angular, и я только что наткнулся на это интересное поведение.Было бы полезно узнать, существует ли простой обходной путь.
Пример
ПРИМЕР: https://stackblitz.com/edit/angular-ukkecu
В моем приложении есть 3 компонента-оболочки, которые будут корневым элементом моего приложения.Только один будет показан в то время.Показанный компонент будет определять тему для всего сайта.Он должен включать в себя глобальные стили, в частности, выделенный вариант глобального стиля (темы).По этой причине у всех есть 'encapsulation: ViewEncapsulation.None'
.Каждый глобальный стиль имеет свой собственный скомпилированный вариант начальной загрузки и другие внешние плагины на основе переменных SASS.Таким образом, инкапсуляция здесь не подходит, это глобальные стили и плагины.
Решение отлично работает с первого раза, пока не отобразятся другие компоненты и элементы <style>
не будут добавлены к <head>
.После этого будут использоваться только стили из последнего использованного компонента, поскольку его <style>
пришел последним и переопределил все предыдущие стили.
Возможные решения
Кажется, что единственное решение будетбыть, чтобы перезагрузить страницу, или не использовать компоненты для переключения глобальной темы.