Comme quelqu'un l'a déjà dit, si vous utilisez une bibliothèque tierce, il est pratiquement impossible d'éviter le ::ng-deep
de temps en temps.
Jetons un coup d'œil à quelques alternatives
-
Utiliser ViewEncapsulation.None
@Component({
selector: 'app-example',
templateUrl: './example.component.html',
styleUrls: ['./example.component.scss'],
encapsulation: ViewEncapsulation.None
})
Sachez que le fait de casser l'encapsulation du composant rendra les styles globalement disponibles. Je peux penser à 2 façons d'éviter les collisions et les bizarreries CSS :
- Enveloppez le template de votre composant avec une classe. Ainsi, example.component.html devrait ressembler à ceci:
Maintenant, comme il n'y a pas d'Encapsulation, vous pouvez modifier le composant tiers en ciblant leurs classes. Cela dit, example.component.scss devrait ressembler à ceci:
.app-example-container {
/* Tout le code CSS va ici */
.mat-tab-group .mat-tab-label {color: red;}
}
- Utiliser des styles globaux
Aussi simple que d'ajouter un nouveau fichier CSS à votre tableau de styles de votre fichier de configuration angular.json
. Sachez que cela deviendra éventuellement de plus en plus difficile à maintenir. Personnellement, j'éviterais cette option ou l'utiliserait en dernier recours :)
- Utiliser une directive
Je suis d'accord que c'est un peu douloureux car vous ne pouvez pas inclure Styles dans une directive (de la même manière que vous le faites dans un composant), mais cela peut parfois être pratique. Vous pourriez également utiliser un composant pour appliquer les styles de la même manière que l'équipe Angular Material l'a fait avec les boutons
- :host ::ng-deep
Vous connaissez déjà celui-ci, je voulais juste préciser que l'utiliser avec le sélecteur hôte est la manière recommandée par Angular pour éviter les éventuelles collisions de styles.
Une note personnelle pour le futur : https://angular.io/guide/component-styles
C'est le premier endroit où regarder pour les alternatives officielles/manières de procéder
- Encouragez les auteurs de bibliothèques à utiliser des variables CSS que vous pourriez personnaliser depuis le composant parent ou les parties ombrées (quand c'est possible). L'équipe Ionic a fait un excellent travail à ce sujet. Pour une explication plus détaillée, vous pouvez consulter ici
Édition 1. Comme @beppe9000 l'a mentionné dans un commentaire, ::ng-deep est une chose d'Angular. Même si l'équipe Angular supprimait cette fonctionnalité demain, votre application déjà déployée continuerait de fonctionner. La confusion est apparue à cause de l'ancien /deep/
modificateur.
9 votes
::ng-deep
ne va nulle part. Ce sera toujours un paramètre que vous pouvez activer. Ils ne peuvent absolument pas le supprimer maintenant sans une réaction massive de la communauté. Regardez combien de résultats reviennent pour cette recherche github.com/search?q=%3A%3Ang-deep&type=Code - c'est comme dire que la propriété css!important
va disparaître0 votes
Je ne sais pas - j'ai effectué une recherche à l'échelle du projet par curiosité dans notre mono-repo (plusieurs applications d'entreprise assez grandes) et je n'ai trouvé que 69 références. J'ai l'impression que c'est certainement une refonte acceptable pour sortir de l'obsolescence et je le ferais volontiers chaque fois qu'ils proposent une alternative. De plus,
!important
occupe une place importante dans la spécification CSS alors que::deep
n'était toujours qu'une proposition.