Angular - 5.9-Comprendre l'encapsulation des vues
En faisant évoluer notre application, on remarque un effet de bord intéressant.
Lorsque nous avons déplacé des paragraphes hors de AppComponent — un
dans CockpitComponent, l'autre dans ServerElementComponent
— ils ne sont plus colorés en bleu, alors que app.component.css contient
pourtant une règle p { color: blue; } qui semblerait viser tous les
paragraphes de l'application.
Comment Angular isole les styles
La raison de ce comportement est l'encapsulation de vue imposée par
Angular. Par défaut, Angular fait en sorte que le CSS déclaré pour un composant ne
s'applique qu'à ce composant, et nulle part ailleurs. Pour y parvenir, le framework
ajoute à l'exécution des attributs uniques sur chaque élément, du type
_ngcontent-ejo-2, puis réécrit les sélecteurs CSS pour qu'ils ciblent
uniquement ces attributs. Si on inspecte le DOM dans les outils de développement, on
les voit clairement apparaître sur chaque balise.
- chaque composant reçoit un identifiant unique à la compilation ;
- tous ses éléments DOM portent un attribut
_ngcontent-...reflétant cet identifiant ; - les règles CSS du composant sont automatiquement préfixées pour ne matcher que ces attributs ;
- conséquence : un
p { color: blue; }dansapp.component.cssn'affecte que les paragraphes appartenant directement àAppComponent.
Angular émule ainsi le shadow DOM, une technologie native qui n'est pas encore prise en charge par tous les navigateurs et qui isole nativement les styles d'un composant. C'est le comportement par défaut de l'encapsulation de vue Angular. Dans la prochaine leçon, nous verrons les autres modes d'encapsulation disponibles si l'on souhaite changer ce comportement.