Comprendre les sélecteurs des Directives Angular

Les Directives sont un pilier du Framework Angular. Extrêmement puissantes et versatiles, elles sont parfois mises de côté par manque de compréhension de leur potentiel. En termes simples, une Directive est une classe annotée avec @Directive, une annotation qui attend principalement une propriété clé : le "selector". Dans cet article, nous allons nous concentrer sur la compréhension du "selector", la façon dont il permet à une directive de cibler des balises HTML spécifiques, et comment maîtriser les différentes formes de sélection (par nom, attributs, classes, etc.) pour une manipulation efficace des éléments dans une application Angular. C’est parti !
selecteursangular.png
Victor COLEAU
Mis à jour le 9 Oct 2024

17+

ans
d'experience

60+

experts
techniques

100K

écoutes de notre podcast
logo Axopen

Qu'est-ce qu'une Directive dans Angular ?

Dans le framework JavaScript Angular, Une Directive est simplement une classe annotée de "@Directive". Cette annotation est disponible dans le package de base "@angular/common" et attend a minima la propriété "selector" (c'est elle qui nous intéresse aujourd'hui).

Par la suite, cette directive va s'accrocher à une balise HTML afin d'en modifier les caractéristiques ou comportements, ou exécuter du code plus complexe.

L'objectif ici n'est pas de voir les possibilités qu'offre le contenu d'une directive mais bien de comprendre comment fonctionne la propriété "selector" et comment celle-ci choisit à quelle balise elle doit répondre.

Rappel : la structure d'une balise HTML

Avant toute chose, un petit rappel sur la structure des balises HTML.

Celles-ci sont formées de quatre parties :

  • Une balise ouvrante, définissant le nom (ou tag) de la balise
  • Des attributs, portés par la balise ouvrante et précisant le comportement du composant.
  • Un corps, contenu entre les parties ouvrantes et fermantes de la balise.
  • Une balise fermante, annonçant la fin du composant.

Dans le cas des Directives AngularAngular est un framework de développement JavaScript populaire basé sur TypeScript., seuls le Nom et les Attributs seront importants.

A noter que l'attribut "class", bien que techniquement un attribut comme les autres, a une place particulière. En effet, son omniprésence lui accorde un statut différencié des autres attributs.

Il y a donc trois choses à considérer lorsque l'on veut cibler une balise HTMLHTML (HyperText Markup Language) est un langage permettant de décrire le découpage d'une page web. avec un sélecteur de Directive :

  • Son nom
  • Ses attributs
  • Sa ou ses classes

Les sélecteurs simples

Sélecteur par Nom

La façon la plus simple de différencier un composant est par son nom. Cela peut être une balise HTML native ou un composant Angular.

La Directive dans l'exemple suivant cible tous les éléments qui s'appellent "my-component". 

94b4b74a-1404-4e04-a931-4b4289829030.png

Sélecteur par attribut

Le sélecteur par attribut permet de cibler les composants possédant un attribut précis. Il est défini par des crochets [].

La Directive suivante cible tous les éléments ayant l'attribut "my-attr". 

a7116108-c2b0-4355-a362-12c47b2f1d0e.png

Petite subtilité supplémentaire pour ce sélecteur : il est possible de restreindre la sélection selon la valeur de l'attribut.

Le Sélecteur suivant ne cible donc que les éléments possédant l'attribut "my-attr" avec une valeur "valid". 

ffdb3666-5e3d-4f59-9d69-b3692303d3f8.png

Sélecteur par Classe

Comme dit plus haut, l'attribut "class" possède son propre sélecteur, défini par un point . précédent le nom de la classe voulue (ce qui rappelle le format CSSFeuilles de style qui permettent de mettre en forme des pages web.).

Ainsi, la Directive suivante cible tous les éléments portant la classe "my-class". 

ac774fc0-7a69-46aa-80d4-07f3f106bb6c.png

Sélecteurs complexes

Les trois sélecteurs simples vus jusqu'ici permettent déjà de pointer précisément vers un composant. Mais il est possible d'être encore plus précis.

Association AND

Il est possible de combiner les sélecteurs afin de ne détecter que les composants qui répondraient à TOUTES les conditions (requête AND). Aucun caractère spécifique n'est requis, il suffit d'écrire les sélecteurs les uns à la suite des autres, sans espace les séparant.

Les sélecteurs peuvent ainsi être enchaînés sans limite de nombre ou d'ordre. 

d3e36116-63be-4d2a-8859-a72516fca8b5.png

Seules deux exceptions sont à noter :

  • Un seul sélecteur par nom maximum
  • Un sélecteur par nom ne peut pas directement suivre un sélecteur par classe (car le point définissant un sélecteur par classe se situe au début et ne permet donc pas de délimiter une fin au sélecteur. Celui par nom le suivant ne pourrait donc pas être distingué.)

Les sélecteurs suivants sont donc invalides. 

9ef7cd49-d10c-4cf7-8174-76ad688f4dbb.png
 
2f1ea7ba-e8ee-4576-9fd7-0520ada5ce1e.png

Association OR

Il est aussi possible de combiner les sélecteurs afin de cibler les composants répondant à AU MOINS UNE condition (requête OR). Pour cela, il faut séparer chaque condition par une virgule , . Il n'y a pas de limite de nombre de conditions différentes pouvant être assemblées. 

d3133cf3-de21-41fa-ade0-9cf3e27946c0.png

A noter que chaque condition peut bien sûr être un sélecteur complexe AND. 

5deda675-df8e-4fe6-a079-e5199b488e83.png

Sélecteur excluant

Il existe un dernier sélecteur permettant d'inverser la sélection des autres.

Il est défini par :not() et prend dans ses parenthèses la condition qu'il doit inverser. Cela peut être un sélecteur par attribut ou par classe. 

ecfba10f-917c-44e3-9ebd-66a7cb7761a0.png

Directives Angular : cas particuliers et dernières informations

Les Directives ayant au nom propre

Dans tous les cas précédemment donnés, les Directives ne faisaient que chercher des éléments avec des noms, classes ou attributs existants mais il est possible qu'une Directive déclare son propre attribut, avec un nom qui lui est propre. 

05da2d76-2c69-4917-9300-eb4b7de83f5b.png

Dans ce cas, l'attribut "my-directive" deviendra valide et pourra être ajouté à n'importe quel élément. Cet élément sera alors reconnu par la Directive qui s'y accrochera.

Les Composants

Il est intéressant de noter que les sélecteurs des Composants Angular fonctionnent de la même façon que les sélecteurs de nom des Directives. Dans ce cas, on peut voir un Composant comme une Directive qui va à la fois créer et rendre disponible un nouvel élément (nouveau tag), et automatiquement s'y accrocher.

Au final, une fois la notion de sélecteur bien maitrisée pour cibler précisément les élément HTML voulus, les Directives sont une méthode très efficace pour injecter du code et des fonctionnalités dans vos pages web. En tant que pilier du framework, tout développeur Angular a beaucoup à gagner à exploiter au maximum leurs possibilités !