Lors de l'écriture d'une directive angulaire, on peut utiliser l'une des fonctions suivantes pour manipuler le comportement DOM, le contenu et l'apparence de l'élément sur lequel la directive est déclarée:
- compiler
- manette
- pré-lien
- post-lien
Il semble y avoir une certaine confusion quant à la fonction à utiliser. Cette question couvre:
Bases de la directive
- Comment déclarer les différentes fonctions?
- Quelle est la différence entre un modèle source et un modèle d'instance ?
- Dans quel ordre les fonctions directives sont-elles exécutées?
- Que se passe-t-il d'autre entre ces appels de fonction?
Nature de la fonction, choses à faire et à ne pas faire
Questions connexes:
- Directive: lien vs compilation vs contrôleur .
- Différence entre les fonctions 'controller', 'link' et 'compile' lors de la définition d'une directive angular.js .
- Quelle est la différence entre la fonction de compilation et de liaison dans angularjs .
- Différence entre l'élément pré-compilation et post-compilation dans les directives AngularJS? .
- Directive JS angulaire - Modèle, compilation ou lien? .
- post link vs pre link dans les directives j angulaires .
Réponses:
Dans quel ordre les fonctions directives sont-elles exécutées?
Pour une seule directive
En fonction du plunk suivant , considérez le balisage HTML suivant:
Avec la déclaration de directive suivante:
La sortie de la console sera:
Nous pouvons voir que cela
compile
est exécuté en premier, puiscontroller
, puis enpre-link
dernierpost-link
.Pour les directives imbriquées
Le balisage HTML d'origine est souvent composé d'éléments imbriqués, chacun avec sa propre directive. Comme dans le balisage suivant (voir plunk ):
La sortie de la console ressemblera à ceci:
Nous pouvons distinguer deux phases ici - la phase de compilation et la phase de liaison .
La phase de compilation
Lorsque le DOM est chargé, Angular démarre la phase de compilation, où il parcourt le balisage de haut en bas et appelle
compile
toutes les directives. Graphiquement, nous pourrions l'exprimer ainsi:Il est peut-être important de mentionner qu'à ce stade, les modèles que la fonction de compilation obtient sont les modèles source (pas le modèle d'instance).
La phase de liaison
Les instances DOM sont souvent simplement le résultat d'un modèle source rendu au DOM, mais elles peuvent être créées par
ng-repeat
ou introduites à la volée.Chaque fois qu'une nouvelle instance d'un élément avec une directive est rendue au DOM, la phase de liaison démarre.
Dans cette phase, Angular appelle
controller
,pre-link
itère les enfants et appellepost-link
toutes les directives, comme ceci:la source
Que se passe-t-il d'autre entre ces appels de fonction?
Les diverses fonctions de directive sont exécutées à partir de deux autres fonctions angulaires appelées
$compile
(où la directivecompile
est exécutée) et une fonction interne appeléenodeLinkFn
(où celle de la directivecontroller
,preLink
etpostLink
sont exécutées). Diverses choses se produisent dans la fonction angulaire avant et après l'appel des fonctions directives. Peut-être plus particulièrement est la récursivité enfant. L'illustration simplifiée suivante montre les étapes clés des phases de compilation et de liaison:Pour illustrer ces étapes, utilisons le balisage HTML suivant:
Avec la directive suivante:
Compiler
L'
compile
API ressemble à ceci:Souvent, les paramètres sont préfixés
t
pour signifier que les éléments et les attributs fournis sont ceux du modèle source, plutôt que ceux de l'instance.Avant l'appel au
compile
contenu transclus (le cas échéant) est supprimé et le modèle est appliqué au balisage. Ainsi, l'élément fourni à lacompile
fonction ressemblera à ceci:Notez que le contenu transclus n'est pas réinséré à ce stade.
Après l'appel à la directive
.compile
, Angular traversera tous les éléments enfants, y compris ceux qui viennent d'être introduits par la directive (les éléments de modèle, par exemple).Création d'instance
Dans notre cas, trois instances du modèle source ci-dessus seront créées (par
ng-repeat
). Ainsi, la séquence suivante s'exécutera trois fois, une fois par instance.Manette
L'
controller
API implique:En entrant dans la phase de liaison, la fonction de liaison renvoyée via
$compile
est désormais dotée d'une étendue.Tout d'abord, la fonction de liaison crée une portée enfant (
scope: true
) ou une portée isolée (scope: {...}
) si elle est demandée.Le contrôleur est ensuite exécuté, avec la portée de l'élément d'instance.
Pré-lien
L'
pre-link
API ressemble à ceci:Il ne se passe pratiquement rien entre l'appel à la directive
.controller
et la.preLink
fonction. Angular fournit toujours des recommandations sur la façon dont chacun doit être utilisé.Après l'
.preLink
appel, la fonction de liaison traversera chaque élément enfant - en appelant la fonction de lien correcte et en y attachant la portée actuelle (qui sert de portée parent pour les éléments enfants).Post-lien
L'
post-link
API est similaire à celle de lapre-link
fonction:Il convient peut-être de noter qu'une fois la
.postLink
fonction d' une directive appelée, le processus de liaison de tous ses éléments enfants est terminé, y compris toutes les.postLink
fonctions enfants .Cela signifie qu'au moment de l'
.postLink
appel, les enfants sont «vivants» sont prêts. Ceci comprend:Le modèle à ce stade ressemblera donc à ceci:
la source
Comment déclarer les différentes fonctions?
Compilation, contrôleur, pré-lien et post-lien
Si l'on doit utiliser les quatre fonctions, la directive suivra cette forme:
Notez que la compilation renvoie un objet contenant à la fois les fonctions pré-lien et post-lien; en jargon angulaire, nous disons que la fonction de compilation renvoie une fonction de modèle .
Compilation, contrôleur et post-lien
Si ce
pre-link
n'est pas nécessaire, la fonction de compilation peut simplement renvoyer la fonction post-lien au lieu d'un objet de définition, comme ceci:Parfois, on souhaite ajouter une
compile
méthode, une fois lalink
méthode (post) définie. Pour cela, on peut utiliser:Contrôleur et post-lien
Si aucune fonction de compilation n'est nécessaire, on peut ignorer complètement sa déclaration et fournir la fonction post-lien sous la
link
propriété de l'objet de configuration de la directive:Pas de contrôleur
Dans l'un des exemples ci-dessus, on peut simplement supprimer la
controller
fonction si elle n'est pas nécessaire. Ainsi, par exemple, si seule lapost-link
fonction est nécessaire, on peut utiliser:la source
Quelle est la différence entre un modèle source et un modèle d'instance ?
Le fait qu'Angular autorise la manipulation DOM signifie que le balisage d'entrée dans le processus de compilation diffère parfois de la sortie. En particulier, certaines balises d'entrée peuvent être clonées plusieurs fois (comme avec
ng-repeat
) avant d'être rendues dans le DOM.La terminologie angulaire est un peu incohérente, mais elle distingue toujours deux types de balises:
Le balisage suivant illustre cela:
Le code source HTML définit
qui sert de modèle source.
Mais comme il est enveloppé dans une
ng-repeat
directive, ce modèle source sera cloné (3 fois dans notre cas). Ces clones sont un modèle d'instance, chacun apparaîtra dans le DOM et sera lié à la portée appropriée.la source
Fonction de compilation
La
compile
fonction de chaque directive n'est appelée qu'une seule fois, lors du démarrage angulaire.Officiellement, c'est l'endroit pour effectuer des manipulations de modèle (source) qui n'impliquent pas la portée ou la liaison de données.
Cela se fait principalement à des fins d'optimisation; considérez le balisage suivant:
La
<my-raw>
directive rendra un ensemble particulier de balises DOM. On peut donc soit:ng-repeat
duplication du modèle source (<my-raw>
), puis modifiez le balisage de chaque modèle d'instance (en dehors de lacompile
fonction).compile
fonction), puis autorisez-leng-repeat
à le dupliquer.S'il y a 1000 articles dans la
raws
collection, cette dernière option peut être plus rapide que la précédente.Faire:
Ne pas
la source
Fonction contrôleur
La
controller
fonction de chaque directive est appelée chaque fois qu'un nouvel élément associé est instancié.Officiellement, la
controller
fonction est là où l'on:Encore une fois, il est important de se rappeler que si la directive implique une portée isolée, toutes les propriétés qu'elle hérite de la portée parent ne sont pas encore disponibles.
Faire:
Ne pas:
la source
Fonction post-lien
Lorsque la
post-link
fonction est appelée, toutes les étapes précédentes ont eu lieu - liaison, transclusion, etc.C'est généralement un endroit pour manipuler davantage le DOM rendu.
Faire:
la source
Fonction de pré-liaison
La
pre-link
fonction de chaque directive est appelée chaque fois qu'un nouvel élément associé est instancié.Comme vu précédemment dans la section Ordre de compilation, les
pre-link
fonctions sont appelées parent-puis-enfant, tandis que lespost-link
fonctions sont appeléeschild-then-parent
.La
pre-link
fonction est rarement utilisée, mais peut être utile dans des scénarios spéciaux; par exemple, lorsqu'un contrôleur enfant s'enregistre auprès du contrôleur parent, mais que l'enregistrement doit être effectué de la mêmeparent-then-child
manière (ngModelController
fait les choses de cette façon).Ne pas:
la source