Angulaire: caractéristiques non évidentes des sélecteurs de directives

Si vous avez déjà créé des directives angulaires, vous avez probablement utilisé une construction utilisant des crochets comme sélecteur: ([]) . Une telle approche, bien qu'elle soit le plus souvent appliquée, n'est pas la seule possible. En fait, les sélecteurs utilisés dans les directives donnent au programmeur un large champ de créativité. Afin de démontrer cette idée en action, le matériel, dont nous publions la traduction aujourd'hui, discute de la méthodologie pour créer une directive conçue pour fonctionner avec des liens externes qui sont dans le modÚle. En particulier, nous parlerons de la façon dont vous pouvez trouver des éléments HTML ordinaires et, si nécessaire, en excluez certains de la sélection en utilisant la :not pseudoclass.


Directive NgForm


Afin de considĂ©rer un exemple de sĂ©lecteur complexe, jetez un Ɠil Ă  la directive ngForm :

 @Directive({ selector: 'form:not([ngNoForm]):not([formGroup]),ngForm,ng-form,[ngForm]', }) 

Ici, il convient de prĂȘter attention aux Ă©lĂ©ments suivants:

  • La directive peut ĂȘtre conçue pour plusieurs sĂ©lecteurs, qui peuvent ĂȘtre rĂ©pertoriĂ©s avec une virgule.
  • Ici, vous pouvez mĂ©langer des Ă©lĂ©ments cibles HTML (comme <form> ) avec des attributs HTML (comme ngForm ).
  • Pour exclure certains Ă©lĂ©ments de la sĂ©lection, vous pouvez utiliser la :not pseudo- :not .

Création d'une directive pour travailler avec des liens externes


Par lien externe, nous entendons la balise <a> , qui n'a pas de directive routerLink . Compte tenu de ce que nous avons dĂ©couvert en analysant l'exemple prĂ©cĂ©dent, le sĂ©lecteur correspondant peut ĂȘtre dĂ©crit comme suit:

 @Directive({ selector: 'a:not([routerLink])', }) 

La beautĂ© de ce sĂ©lecteur est que nous n'avons pas besoin de crĂ©er un nom d'attribut pour quelque chose qui peut ĂȘtre dĂ©crit comme l'opposĂ© d'une entitĂ©.

Nous pouvons, pour mettre en évidence des liens externes, utiliser quelque chose comme une directive avec le nom externalLink , mais cela est complÚtement inutile, car cette approche se traduit par une duplication des mécanismes existants. De plus, il est facile d'oublier d'ajouter une directive similaire à certains liens externes. La force de notre méthode est que, grùce à une seule ligne, nous pouvons accéder à tous les liens externes.

Les résultats de l'application de la directive aux liens externes devraient ressembler à ceci:

  • Le lien devrait s'ouvrir dans une fenĂȘtre sĂ©parĂ©e.
  • L' rel doit ĂȘtre ajoutĂ© au lien, ce qui amĂ©liorera les performances et augmentera la sĂ©curitĂ© de la solution.

Ces deux objectifs sont réalisables grùce à l'utilisation de @HostBinding() :

 @Directive({ selector: 'a:not([routerLink])' }) export class ExternalLinkDirective { @HostBinding('rel') @Input() rel = 'noopener'; @HostBinding('target') @Input() target = '_blank'; } 

Veuillez noter qu'ici, entre autres, nous avons décoré les propriétés à l'aide du décorateur @Input() , ce qui, si nécessaire, ouvre des possibilités de redéfinition.

Une autre implĂ©mentation valide d'une telle solution peut ĂȘtre d'utiliser le dĂ©corateur @Attribute() . Cette approche donnera une lĂ©gĂšre augmentation des performances, car, contrairement au dĂ©corateur @Input() , lorsque vous utilisez @Attribute() valeurs des propriĂ©tĂ©s correspondantes sont calculĂ©es une seule fois, c'est-Ă -dire que les propriĂ©tĂ©s rel et target ne sont pas constamment vĂ©rifiĂ©es dans le cycle de vĂ©rification des modifications.

Des dĂ©tails sur cette technique peuvent ĂȘtre trouvĂ©s ici .

Directive sur les tests


Créons un simple bloc de navigation contenant des liens menant à des ressources externes:

 <nav> <a href="https://google.com">Google</a> <a href="https://bing.com">Bing</a> <a href="https://forbes.com">Forbes</a> </nav> 

Si, à l'aide des outils du développeur Chrome, vous voyez le code HTML correspondant, vous pouvez voir ce qui suit:


Code HTML du bloc de navigation aprĂšs application de la directive

C'est exactement ce dont nous avons besoin. La directive fonctionne sans avoir besoin de sélecteurs d'attributs supplémentaires.

Résumé


De ce matériel, vous avez appris que lorsque vous travaillez avec des directives angulaires, il n'est pas nécessaire d'utiliser des sélecteurs d'attributs. Ici, nous avons d'abord examiné la directive ngForm , puis utilisé les connaissances que nous avons acquises pour créer notre propre directive conçue pour fonctionner avec des liens externes. Nous espérons que cette technique vous sera utile.

Chers lecteurs! Si vous connaissez des techniques non évidentes pour développer des projets Web à l'aide d'Angular, veuillez nous en parler.

Source: https://habr.com/ru/post/fr421345/


All Articles