Directive personnalisée AngularJS : Modèles, portée et transclusion

⚡ Résumé intelligent

Les directives personnalisées d'AngularJS étendent le HTML avec un comportement réutilisable que vous définissez vous-même. Une fabrique de directives renvoie un objet de définition, et AngularJS applique ce comportement partout où l'élément, l'attribut, la classe ou le commentaire correspondant apparaît dans le balisage.

  • ???? Enregistrement: La méthode module.directive prend un nom normalisé ainsi qu'une fonction de fabrique qui renvoie l'objet de définition de la directive.
  • 🔤 Appellation: Les noms sont en camelCase à l'intérieur JavaScript et kebab-case à l'intérieur du HTML, donc ngGuru est écrit ng-guru sur la page.
  • (I.e. Correspondant à: La propriété « restrict » détermine si AngularJS correspond à un élément, un attribut, une classe ou un commentaire, et sa valeur par défaut est EA.
  • 🧬 Accès au périmètre : Une directive partage par défaut la portée parente, tandis que l'option scope construit une portée isolée avec les liaisons @, =, & ou <.
  • 🔗 Fonction de lien : La fonction link reçoit scope, element et attrs, et c'est l'endroit approprié pour les écouteurs DOM et le nettoyage.
  • 🧱 Composition: Les directives s'imbriquent les unes dans les autres, encapsulent du balisage arbitraire par transclusion et exposent une API aux directives sœurs via un contrôleur.
  • ⚠️ Statut de support : AngularJS a atteint sa fin de vie le 31 décembre 2021 et ne reçoit plus aucun correctif ni mise à jour de sécurité.

Directives personnalisées dans AngularJS

Qu'est-ce qu'une directive personnalisée dans AngularJS ?

A Directive douanière Dans AngularJS, une directive définie par l'utilisateur étend le HTML avec un comportement que vous écrivez vous-même. Elle est enregistrée sur un module En utilisant la fonction « directive », AngularJS l'applique partout où l'élément ou l'attribut correspondant apparaît dans la page. Bien qu'AngularJS possède de nombreuses fonctionnalités puissantes, il est important de noter que cette approche est particulièrement efficace. directives intégrées prêts à l'emploi, tels que ng-répétition, parfois des directives personnalisées sont nécessaires.

⚠️ Correction: Le texte original indiquait qu'une directive personnalisée « remplace l'élément auquel elle se rapporte ». Par défaut, ce n'est pas le cas : template est inséré à l'intérieur l'élément correspondant. Besoins de remplacement replace: true, obsolète depuis AngularJS 1.3.

⚠️ Avis d'assistance : AngularJS a atteint fin de vie le 31 décembre 2021 et ne reçoit plus de correctifs ni de mises à jour de sécurité. Les informations ci-dessous restent valables pour la maintenance du code AngularJS 1.x existant ; dans Angular moderne, les équivalents sont les composants et les directives d’attributs.

L'intérêt d'utiliser une directive personnalisée réside dans la répétition. Lorsqu'un même balisage ou une même structure DOM apparaît sur plusieurs écrans, une directive le transforme en une seule balise nommée.

Comment créer une directive personnalisée ?

Prenons l'exemple de la création d'une directive personnalisée AngularJS.

Dans notre cas, la directive personnalisée va simplement injecter une balise div contenant le texte « Tutoriel Angular JS » dans notre page lorsque la directive est appelée.

La capture d'écran annotée ci-dessous numérote les quatre parties de la liste expliquées ensuite.

Créer une directive personnalisée

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <div ng-guru=""></div>

</div>

<script type="text/javascript">
    var app = angular.module('DemoApp',[]);
    app.directive('ngGuru',function(){

    return {
        template: '<div>Angular JS Tutorial</div>'
    }
    });

</script>

</body>
</html>

⚠️ Avertissement — défauts non mentionnés dans cette annonce : Le code est reproduit à l'identique. Trois défauts se retrouvent systématiquement dans chaque exemple : chrset="UTF 8" devrait être charset="UTF-8"; angular.js et angular.min.js Les deux se chargent, donc AngularJS se charge deux fois ; et angular-route.js se charge avant le fichier dont il dépend.

Code Explication

  1. Nous créons d'abord un module pour notre application AngularJS. Ceci est nécessaire pour créer une directive personnalisée car celle-ci sera créée à l'aide de ce module.
  2. Nous sommes en train de créer une directive personnalisée appelée « ng »Guru« et en définissant une fonction de fabrique qui contiendra le code personnalisé de notre directive. »
  3. Nous utilisons le paramètre `template`, défini par AngularJS pour les directives personnalisées. Ainsi, chaque fois que cette directive est utilisée, la valeur du modèle est injectée dans le code appelant.
  4. Nous utilisons ici notre directive personnalisée « ng-guru ». Dans ce cas, la valeur que nous avons définie pour notre modèle, <div>Angular JS Tutorial</div>, sera maintenant injecté ici.

Dénomination et normalisation des directives

La discordance des noms entre les JavaLe code JavaScript et le HTML déroutent la plupart des débutants. AngularJS normalise chaque nom d'élément et d'attribut avant de le faire correspondre : il supprime tout x- or data- préfixe, puis convertit un nom délimité par -, : or _ en camelCase. C'est pourquoi ngGuru allumettes ng-guru, et pourquoi data-ng-guru Cela fonctionne aussi. La forme camelCase est le nom correct ; la forme kebab-case est simplement la façon dont elle est écrite en HTML.

⚠️ Correction: Le texte original indiquait que le nom d'une directive personnalisée « devait commencer par les lettres 'ng' ». Documentation officielle d'AngularJS conseille le contraire : ne jamais préfixer ses propres directives par ng, ou ils pourraient entrer en conflit avec une future fonction intégrée. Utilisez votre propre préfixe, tel que g99Guru écrit comme g99-guru.

Si le code s'exécute correctement, ce résultat s'affiche.

Sortie :

Créer une directive personnalisée

Le résultat montre clairement que notre directive ng-guru personnalisée, qui contient le modèle défini pour l'affichage d'un texte personnalisé, s'affiche correctement dans le navigateur. L'étape suivante consiste à intégrer du contenu réutilisable dans ce modèle.

Comment créer des directives réutilisables

Nous avons déjà vu la puissance des directives personnalisées, mais nous pouvons passer au niveau supérieur en créant nos propres directives réutilisables.

Supposons, par exemple, que nous voulions injecter du code qui afficherait toujours les balises HTML ci-dessous sur plusieurs écrans, qui correspondent essentiellement à un champ de saisie pour le « Nom » et l’« âge » de l’utilisateur.

Créer des directives réutilisables

Pour réutiliser ce fragment sur plusieurs écrans sans avoir à le recoder à chaque fois, nous créons un contrôle principal, ou directive, dans AngularJS pour contenir ces deux contrôles.

Désormais, au lieu de répéter ce balisage sur chaque écran, nous l'intégrons dans une directive et appelons cette dernière. La capture d'écran ci-dessous indique la seule ligne modifiée.

Créer des directives réutilisables

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <div ng-guru=""></div>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('ngGuru',function(){
        return {

            template: '&nbsp;&nbsp;Name <input type="text"><br><br>&nbsp;&nbsp;&nbsp;Age<input type="text">'
        };
    });

</script>

</body>
</html>

Code Explication

  • Dans notre extrait de code pour une directive personnalisée, seule la valeur du paramètre de modèle change. Au lieu d'une simple balise ou d'une ligne de texte, nous saisissons l'intégralité des deux champs de saisie « Nom » et « Âge » qui doivent être affichés sur notre page.

💡 Astuce: Un modèle aussi long mérite d'être placé dans un fichier séparé. Échanger template pour templateUrl: 'name-age.html'.

Si le code s'exécute correctement, ce résultat s'affiche.

Sortie :

Créer des directives réutilisables

D'après le résultat ci-dessus, l'extrait de code du modèle de la directive personnalisée est bien ajouté à la page. Le modèle étant encore statique, l'étape suivante consiste à l'alimenter en données.

Directives et portées d'AngularJS

Le portée est défini comme le lien qui unit le contrôleur à la vue en gérant les données entre la vue et le contrôleur.

Lors de la création de directives AngularJS personnalisées, celles-ci auront par défaut accès à l'objet scope du contrôleur parent. Il s'agit du même objet scope, et non d'une copie.

De cette façon, il devient facile pour la directive personnalisée d'utiliser les données transmises au contrôleur principal.

Prenons l'exemple de l'utilisation de la portée d'un contrôleur parent dans notre directive personnalisée. La capture d'écran ci-dessous numérote les quatre étapes.

Directives et portées d'AngularJS

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
    <div ng-guru=""></div>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.controller('DemoController',function($scope) {
        $scope.tutorialName = "Angular JS";

    });

        app.directive('ngGuru',function(){
        return {
         template: '<div>{{tutorialName}}</div>'
     }
    });

</script>

</body>
</html>

Code Explication

  1. Nous créons d'abord un contrôleur appelé « DemoController ». Dans celui-ci, nous définissons une variable appelée tutorialName et l'attachons à l'objet scope en une seule instruction : $scope.tutorialName = "Angular JS".
  2. Dans notre directive personnalisée, nous pouvons appeler la variable « tutorialName » en utilisant une expression. Cette variable serait accessible car elle est définie dans le contrôleur « DemoController », qui deviendrait le parent de cette directive.
  3. Nous référençons le contrôleur dans une balise div, qui fera office de balise div parent. Notez que cela doit être fait en premier pour que notre directive personnalisée puisse accéder à la variable tutorielName.
  4. Nous attachons finalement simplement notre directive personnalisée « ng-guru » à notre balise div.

Si le code s'exécute correctement, ce résultat s'affiche.

Sortie :

Directives et portées d'AngularJS

Le résultat ci-dessus montre clairement que notre directive personnalisée « ng-guru » utilise la variable de portée tutorialName du contrôleur parent. Partager la portée du parent est pratique, mais pas toujours souhaitable.

Utiliser des contrôleurs avec des directives

AngularJS offre la possibilité de accéder à la variable membre du contrôleur directement à partir des directives personnalisées sans avoir besoin de l'objet scope.

Cela devient parfois nécessaire car une application peut comporter plusieurs objets de portée appartenant à plusieurs contrôleurs, ce qui augmente considérablement le risque d'accéder par erreur à l'objet de portée du mauvais contrôleur.

Dans un tel scénario, il existe un moyen de dire spécifiquement « Je veux accéder à ce contrôleur » depuis ma directive.

Prenons l'exemple d'une méthode permettant d'y parvenir. La capture d'écran numérote les quatre étapes.

Utiliser des contrôleurs avec des directives

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp" ng-controller="DemoController">
    <div ng-guru99=""></div>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.controller('DemoController',function() {
        this.tutorialName = "Angular";

    });

     app.directive('ngGuru99',function(){
        return {
         controller: 'DemoController',

          controllerAs: 'ctrl',

          template: '{{ctrl.tutorialName}}'
     };
    });

</script>

</body>
</html>

Code Explication

  1. Nous créons d'abord un contrôleur appelé « DemoController ». Dans celui-ci, nous définirons une variable appelée « tutorialName » et cette fois, au lieu de l'attacher à l'objet scope, nous l'attacherons directement au contrôleur.
  2. Dans notre directive personnalisée, nous mentionnons spécifiquement que nous souhaitons utiliser le contrôleur « DemoController » en utilisant le mot-clé de paramètre de contrôleur.
  3. Nous créons une référence au contrôleur à l'aide du paramètre « controllerAs ». Ce paramètre, défini par AngularJS, permet de référencer le contrôleur par un alias.
  4. Enfin, dans notre modèle, nous utilisons la référence créée à l'étape 3 et la variable membre qui a été attachée directement au contrôleur à l'étape 1.

À noter: Il est possible d'accéder à plusieurs contrôleurs dans une directive en spécifiant les blocs respectifs du contrôleur, du contrôleur et des instructions de modèle. Pour atteindre un mère Utilisez plutôt le contrôleur de la directive. require.

Si le code s'exécute correctement, ce résultat s'affiche.

Sortie :

Utiliser des contrôleurs avec des directives

Le résultat montre clairement que la directive personnalisée accède au DemoController et à la variable membre tutorialName qui lui est associée, et affiche le texte « Angular ». Les deux approches lisent toujours à partir d'une portée partagée, ce qu'une portée isolée empêche.

Comment les liaisons @, =, & et < diffèrent dans une portée isolée

Une directive qui partage la même portée que son parent ne peut être utilisée qu'une seule fois par contrôleur, car deux copies entreraient en conflit sur les mêmes variables. scope L'objet crée un isoler la portéeLa directive ne voit rien d'extérieur, hormis les propriétés que vous listez. Chaque entrée utilise un symbole de préfixe indiquant comment sa valeur est transmise.

Symbole Direction Valeur reçue Utilisez-le pour
@ Sens unique L'attribut sous forme de chaîne interpolée Étiquettes, titres, tout texte brut
= À double sens L'objet ou la valeur vivante elle-même Modèles que la directive réécrit en retour à
& Appel extérieur Une fonction évaluant une expression dans la portée extérieure Les rappels tels que la fermeture ou l'enregistrement
< Sens unique La valeur évaluée, jamais écrite vers le haut Données en lecture seule, ajoutées dans AngularJS 1.5

💡 Astuce: Atteindre pour < avant =La liaison unidirectionnelle est moins coûteuse à surveiller et empêche un composant de modifier silencieusement les données de son appelant. La section suivante utilise @.

Directives et composants AngularJS : ng-transclude

Comme nous l'avons mentionné précédemment, AngularJS est destiné à étendre les fonctionnalités de HTML. Et nous avons déjà vu comment injecter du code en utilisant des directives personnalisées réutilisables.

Mais dans le développement moderne d'applications web, il existe également un concept de développementping Les composants web, c'est-à-dire créer nos propres balises HTML qui peuvent être utilisées comme composants dans notre code.

AngularJS offre ainsi un niveau de puissance supplémentaire pour étendre les balises HTML en permettant d'encapsuler tout balisage que l'appelant place à l'intérieur de la balise.

Ceci est fait par le "ng-transclure« directive », qui indique à AngularJS de capturer tout ce qui est placé à l'intérieur de la balise personnalisée dans le balisage et de l'insérer dans le modèle à cet endroit.

Prenons un exemple pour illustrer comment y parvenir. La capture d'écran numérote les cinq points suivants.

Directives et composants AngularJS

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <pane title="{{title}}">Angular JS</pane>

</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('pane',function(){
        return {

            transclude:true,
            scope :{title:'@'},
            template: '<div style="border: 1px solid black;"> '+
                        '<ng-transclude></ng-transclude>'+
                            '</div>'
        };
    });

</script>

</body>
</html>

Code Explication

  1. Nous utilisons la directive pour définir une balise HTML personnalisée appelée « pane », dont le code est fourni par une fonction de fabrique. Dans le résultat, la balise « pane » affiche le texte « Angular JS » dans un rectangle bordé de noir.
  2. La propriété « transclude » doit être définie sur true, ce qui indique à AngularJS de conserver le balisage interne d'origine et de le rendre disponible à ng-transclude.
  3. Dans l'objet scope, nous déclarons une liaison de titre. Les attributs sont généralement écrits sous forme de paires nom/valeur, comme ceci : name="value"Dans notre cas, l'attribut de la balise pane est « title », et le symbole « @ » demande à AngularJS de copier cet attribut sous forme de chaîne interpolée.
  4. Le modèle trace la bordure noire continue de notre contrôle et marque l'endroit où le balisage transclus est inséré.
  5. Enfin, nous appelons notre balise HTML personnalisée avec l'attribut title qui a été défini.

⚠️ Correction: Le texte original décrivait « @ » comme « une exigence d'Angular ». Il ne s'agit pas d'une simple formalité : @ est l'un des quatre symboles de liaison à portée isolée du tableau ci-dessus et produit toujours une chaîne de caractères. Ce modèle ne génère jamais non plus {{title}}et aucun contrôleur ne définit title, donc seul le texte transclus est visible.

Si le code s'exécute correctement, ce résultat s'affiche.

Sortie :

Directives et composants AngularJS

  • Le résultat affiche l'élément de panneau personnalisé rendu sous forme de boîte bordée contenant le texte transclus « Angular JS ».

Une directive peut également contenir d'autres directives, ce qui permet d'assembler des composants plus importants.

Directives imbriquées

Dans AngularJS, les directives peuvent être imbriquées, à l'instar des modules ou fonctions internes. langage de programmation, vous devrez peut-être intégrer des directives les unes dans les autres.

Vous pouvez mieux comprendre cela en consultant l’exemple ci-dessous.

Dans cet exemple, nous créons 2 directives appelées « externe » et « interne ».

  • La directive interne affiche un texte appelé « Inner ».
  • Alors que la directive externe appelle en fait la directive interne pour afficher le texte appelé « Inner ».

La capture d'écran ci-dessous indique les deux définitions de directive et le point où l'une appelle l'autre.

Directives imbriquées

</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <outer></outer>
</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('outer',function(){
        return {

            restrict:'E',
            template: '<div><h1>Outer</h1><inner></inner></div>',
        }});

    app.directive('inner',function(){
        return {

            restrict:'E',
            template: '<div><h1>Inner</h1></div>',
        }
    });
</script>

</body>
</html>

⚠️ Avertissement — défaut conservé dans cette annonce : La liste publiée commence à </head>, manquant son ouverture <!DOCTYPE html>, <html> et <head> lignes. Ajoutez-les avant d'exécuter le programme.

Code Explication

  1. Nous créons une directive appelée « externe » qui se comportera comme notre directive parent. Cette directive fera alors appel à la directive « intérieure ».
  2. Le restrict:'E' Cette option indique à AngularJS de faire correspondre chaque directive par un élément nom, c'est pourquoi ils peuvent être écrits comme des étiquettes <outer> et <inner>La lettre « E » est l'abréviation du mot « Element ».
  3. Ici, nous créons la directive interne qui affiche le texte « Inner » dans une balise div.
  4. Dans le modèle de la directive externe, nous appelons la directive interne. Nous injectons donc ici le modèle de la directive interne dans la directive externe.
  5. Enfin, nous appelons directement la directive extérieure.

⚠️ Correction: Le texte original prétendait restrict:'E' est requis « pour garantir que les données de la directive interne soient disponibles pour la directive externe ». Il ne fait rien de tel ; il ne fait que contrôler how Une directive peut être écrite. L'imbrication fonctionne car le compilateur continue d'entrer dans le modèle qu'il vient d'insérer. Pour partager des données, utilisez require et controller.

Si le code s'exécute correctement, ce résultat s'affiche.

Sortie :

Directives imbriquées

De la sortie,

  • On constate que les directives externe et interne ont toutes deux été appelées, et que le texte des deux balises div est affiché.

Le rendu du balisage ne représente que la moitié du travail d'une directive ; l'autre moitié consiste à réagir à l'utilisateur.

Gestion des événements dans une directive

Événements Les actions telles que les clics de souris ou de boutons peuvent être gérées directement depuis les directives. Ceci est réalisé grâce à la fonction `link`. Cette fonction permet à la directive de s'associer aux éléments DOM d'une page HTML.

syntaxe:

La syntaxe de la fonction lien est présentée ci-dessous.

link: function ($scope, element, attrs)

La fonction de lien accepte généralement trois paramètres : la portée, l’élément auquel la directive est associée et les attributs de l’élément cible. Deux autres paramètres, un contrôleur requis et une fonction de transclusion, sont fournis lorsqu’ils sont utilisés.

Phase de compilation versus phase de liaison

AngularJS traite une directive en deux passes, et savoir laquelle est laquelle vous indique où votre code doit être placé.

  • Compiler Cette fonction s'exécute une seule fois sur l'élément modèle, avant toute définition de portée. Elle convient aux modifications structurelles partagées par tous les clones.
  • Lien Cette fonction s'exécute une seule fois par instance, après le clonage du modèle et l'association d'une portée. Les écouteurs DOM et les lectures de portée doivent être effectués ici.

Étant donné que la compilation n'a pas de portée, tout ce qui nécessite des données doit être intégré à l'édition de liens, c'est pourquoi l'exemple ci-dessous définit link seul.

Prenons un exemple pour illustrer comment nous pouvons y parvenir. La capture d'écran numérote les quatre points ci-dessous.

Gestion des événements dans une directive

<!DOCTYPE html>
<html>
<head>
    <meta chrset="UTF 8">
    <title>Event Registration</title>
</head>
<body>

<script src="https://code.angularjs.org/1.6.9/angular-route.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<script src="https://code.angularjs.org/1.6.9/angular.min.js"></script>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>

<h1> Guru99 Global Event</h1>

<div ng-app="DemoApp">
    <div ng-guru="">Click Me</div>
</div>

<script type="text/javascript">

    var app = angular.module('DemoApp',[]);

    app.directive('ngGuru',function(){
        return {

            link:function($scope,element,attrs) {
                element.bind('click',function () {
                    element.html('You clicked me');
                });}
        }});
</script>

</body>
</html>

Code Explication

  1. Nous utilisons la fonction link telle que définie dans AngularJS pour donner à la directive la possibilité d'accéder aux événements du DOM HTML.
  2. Nous utilisons le mot-clé « element » car nous souhaitons réagir à un événement lié à un élément DOM HTML, en l'occurrence l'élément « div ». Nous utilisons ensuite la fonction « bind » pour personnaliser l'événement de clic de cet élément. Le mot-clé « click » désigne l'événement de clic de n'importe quel contrôle HTML.
  3. Nous indiquons ici que nous voulons remplacer le code HTML interne de l'élément, dans notre cas l'élément div, par le texte « Vous avez cliqué sur moi ».
  4. Ici, nous définissons notre balise div pour utiliser la directive personnalisée ng-guru.

💡 Astuce: Une directive doit se nettoyer elle-même. Supprimez tout écouteur qui survit à l'élément qu'elle contient. element.on('$destroy', ...), ou la page présente une fuite de mémoire.

Si le code s'exécute correctement, ce résultat s'affiche.

Sortie :

Gestion des événements dans une directive

  • Au départ, le texte « Cliquez ici » s'affiche, car c'est ce qui était défini dans la balise div. Lorsque vous cliquez sur la balise div, le résultat ci-dessous s'affiche.

Gestion des événements dans une directive

Chaque exemple ci-dessus utilisait une ou deux propriétés du même objet de définition. L'ensemble complet mérite d'être conservé.ping à portée de main.

Référence des propriétés d'objet de définition de directive

L'objet renvoyé par une fabrique de directives est le Objet de définition de directiveChaque propriété répond à une question sur le comportement de la directive.

Propriétés Réglage par défaut Ce qu'il fait
restreindre 'EA' Quelles formes correspondent : E élément, A attribut, C classe, M commentaire
modèle aucun Balisage en ligne inséré dans l'élément correspondant
URL du modèle aucun Chemin du fichier modèle, récupéré une seule fois puis mis en cache
portée non false partage la portée parente, true crée un enfant, un objet isole
contrôleur aucun Constructeur exposant une API ; d’autres directives peuvent être requises
contrôleur aucun Alias ​​du contrôleur à l'intérieur du modèle
exigent aucun Contrôleur d'une autre directive à injecter ; ^ recherche les parents, ^^ ignore la directive elle-même, ? optionnel
lien aucun Fonction par instance : portée, élément, attributs, contrôleur, transcludeFn
compiler aucun S'exécute une fois sur le modèle avant que toute portée ne soit établie.
transclure non Préserve le balisage interne d'origine pour ng-transclude
priorité 0 Ordre de compilation sur un élément partagé ; les éléments les plus importants sont exécutés en premier.
terminal non Bloque les directives de priorité inférieure sur cet élément
remplacer non Remplace l'élément par le modèle. Déprécié depuis la version 1.3.

💡 Astuce: Préparer : restrict, template et link. Ajouter scope pour réutilisation, controller et require pour les appels directifs, et laissez priority et terminal seul.

FAQ

Un composant, introduit dans AngularJS 1.5, est une directive avec des comportements par défaut prédéfinis : correspondance limitée aux éléments, portée isolée et contrôleur. Utilisez un composant pour une vue autonome et une directive lorsque vous avez besoin d'accéder au DOM au niveau des liens.

Généralement, le nom n'était pas normalisé correctement, ou la restriction excluait le format utilisé. Une directive enregistrée comme monBox correspond à my-box, et non à mybox, et une balise d'élément doit être restreinte pour inclure E.

Oui. AI Les assistants associent une portée isolée aux décorateurs d'entrée et de sortie et un modèle à un modèle de composant. RevExaminer manuellement le code DOM de transclusion et de fonction de lien, car ceux-ci se traduisent rarement correctement.

Les assistants IA génèrent Test de l'unité Ces squelettes compilent la directive, lui associent une portée et vérifient le résultat rendu. Ils sont efficaces pour identifier les cas limites ; considérez donc les assertions générées comme une ébauche.

Utilisez templateUrl dès que le balisage dépasse une ou deux lignes. Le fichier est modifiable avec les outils HTML classiques et n'est chargé qu'une seule fois, puis servi depuis le cache de modèles pour chaque instance ultérieure.

Résumez cet article avec :