51 votes

::ng-deep va être déprécié - Des alternatives ?

Le docteur dit :

Le combinateur descendant de type "shadow-piercing" est déprécié et son support est supprimé des principaux navigateurs et outils. Nous prévoyons donc de ne plus le prendre en charge dans Angular (pour les trois combinaisons /deep/, >>> et ::ng-deep). En attendant, il convient de préférer ::ng-deep pour une compatibilité plus large avec les outils.

Puisque je veux passer aux nouvelles versions sans changer le code, quelles sont les alternatives pour les méthodes dépréciées ?

3 votes

@trichetriche simply add classes or other selectors to your HTML elements Les styles d'Angular ne fonctionnent pas de cette manière si vous essayez de donner un style aux nœuds du DOM à l'intérieur d'un composant enfant dans votre modèle, en raison de l'encapsulation du style (imitation du DOM caché dans le navigateur).

0 votes

@DanielWStrimpel c'est pour cela que j'ai demandé une exemple minimal reproductible . Il suffit de supprimer l'encapsulation ou d'utiliser des styles globaux, avec un simple sélecteur de composant, vous pouvez vous débarrasser de ce pseudo-sélecteur.

1 votes

@trichetriche with only a component selector you can get ride of that pseudo selector Oui, tant que vous enlevez l'encapsulation.

50voto

Daniel W Strimpel Points 5062

Après avoir parcouru les notes réelles de la réunions de comité sur ce sujet, il semble qu'il n'y ait pas encore d'alternative proposée. En utilisant le ::ng-deep permet de laisser Angular se charger de rompre l'encapsulation des styles (pour les nœuds du DOM dans les composants enfants de votre modèle) qu'il effectue pour vos styles (et de ne pas utiliser les fonctionnalités natives du navigateur, ce qui le rend évidemment plus résistant à l'avenir). Je pense que cette note est juste pour vous faire savoir qu'ils prévoient de mettre en œuvre le mécanisme du navigateur dès qu'il sera mis en place. Personnellement, je n'hésiterais pas à l'utiliser.

La seule façon d'éviter d'utiliser cet opérateur dans votre CSS est de ne pas laisser Angular gérer l'encapsulation du style de votre composant en procédant ainsi :

import { ViewEncapsulation } from '@angular/core';

@Component({
    ...
    encapsulation: ViewEncapsulation.None
})

Si vous faites cela, vos styles deviennent cependant globaux. Veillez donc à faire précéder chaque règle de style de votre composant pour vous assurer qu'ils ne fuient pas au-delà. Par exemple, si vous avez un MyCustomComponent avec un sélecteur de my-custom-component :

my-custom-component button { ... } /* good */
button { ... } /* bad */

0 votes

Voir aussi cette réponse stackoverflow.com/a/49308475/2275011 et commentaires pour plus de détails et de solutions.

1voto

Gilles Points 1475

Une alternative qui peut fonctionner est d'inclure les styles css dans votre global styles.scss fichier*.

Par exemple, supposons que vous souhaitiez ajouter un style à la section <div class="mat-form-field-flex"> qui est généré sous un <mat-form-field> vous pouvez utiliser ::ng-deep de même :

votre.composant.scss

::ng-deep mat-form-field.mat-form-field div.mat-form-field-flex {
  padding: 0 0 0 .75em;
}

Ou au contraire, vous pouvez changer :

styles.scss :

mat-form-field.mat-form-field  div.mat-form-field-flex {
  padding: 0 0 0 .75em;
}

* : Il s'agit de n'importe quel fichier qui est ajouté à la collection des styles dans votre angular.json fichier.

"styles": [
          "src/theme.scss",
          "src/styles.scss"
        ],

1 votes

Oui, c'est logique, car le fichier de style global est destiné à l'interface globale de l'entreprise. index.html contenant toutes les applications et tous les composants angulaires, bien que cet index n'ait pas d'encapsulations angulaires préétablies équivalentes à ViewEncapsulation.None . Mais je ne pense pas que ce soit une bonne approche à suivre car il sera difficile d'organiser tous les styles d'application dans le fichier global, à moins de créer un dossier de style personnalisé dans lequel vous mettez tous les styles personnalisés ng-deep. et ensuite vous l'importez dans le fichier de style global.

-1voto

shwetas Points 1

Si quelqu'un a encore besoin de cela, il suffit d'utiliser "/deep/" au lieu de ::ng-deep

Exemple :

/deep/.mat-form-field{
  //put style here
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X