Lorsque vous créez une directive, vous pouvez mettre du code dans le compilateur, la fonction de liaison ou le contrôleur.
Dans les documents, ils expliquent que:
- les fonctions de compilation et de liaison sont utilisées dans différentes phases du cycle angulaire
- les contrôleurs sont partagés entre les directives
Cependant, pour moi, ce n'est pas clair, quel type de code devrait aller où.
Par exemple: Puis-je créer des fonctions dans la compilation et les avoir attachées à la portée dans le lien ou seulement attacher des fonctions à la portée dans le contrôleur?
Comment les contrôleurs sont-ils partagés entre les directives, si chaque directive peut avoir son propre contrôleur? Les contrôleurs sont-ils vraiment partagés ou s'agit-il simplement des propriétés d'étendue?
angularjs
angularjs-directive
schacki
la source
la source
Réponses:
Compiler :
C'est la phase où Angular compile réellement votre directive. Cette fonction de compilation est appelée une seule fois pour chaque référence à la directive donnée. Par exemple, supposons que vous utilisez la directive ng-repeat. ng-repeat devra rechercher l'élément auquel il est attaché, extraire le fragment html auquel il est attaché et créer une fonction de modèle.
Si vous avez utilisé des poignées, des modèles de soulignement ou l'équivalent, c'est comme compiler leurs modèles pour extraire une fonction de modèle. À cette fonction de modèle, vous transmettez des données et la valeur de retour de cette fonction est le code HTML avec les données aux bons endroits.
La phase de compilation est cette étape dans Angular qui renvoie la fonction de modèle. Cette fonction de modèle en angulaire est appelée la fonction de liaison.
Phase de liaison:
La phase de liaison est l'endroit où vous attachez les données ($ scope) à la fonction de liaison et elle devrait vous renvoyer le code HTML lié. Puisque la directive spécifie également où va ce HTML ou ce qu'il change, il est déjà bon d'aller. Il s'agit de la fonction dans laquelle vous souhaitez apporter des modifications à l'html lié, c'est-à-dire à l'html qui a déjà les données qui lui sont attachées. En angulaire, si vous écrivez du code dans la fonction de liaison, c'est généralement la fonction post-lien (par défaut). C'est une sorte de rappel qui est appelé après que la fonction de liaison a lié les données au modèle.
Manette :
Le contrôleur est un endroit où vous mettez dans une logique spécifique à la directive. Cette logique peut également entrer dans la fonction de liaison, mais vous devrez alors mettre cette logique sur la portée pour la rendre "partageable". Le problème avec cela est que vous corrompriez alors la portée avec vos trucs de directives, ce qui n'est pas vraiment quelque chose qui est attendu. Alors, quelle est l'alternative si deux directives veulent se parler / coopérer? Bien sûr, vous pouvez mettre toute cette logique dans un service, puis faire dépendre ces deux directives de ce service, mais cela ne fait qu'apporter une dépendance supplémentaire. L'alternative est de fournir un contrôleur pour cette portée (généralement une portée isolée?), Puis ce contrôleur est injecté dans une autre directive lorsque cette directive "requiert" l'autre.
la source
controller
fonction de directive est exécuté après la compilation, mais avantpre-link
dans une branche d'arbre DOM locale. De pluscontroller
, lespre-link
fonctions sont exécutées en traversant la branche DOM locale de manière descendante . Après celapost-link
est exécuté de manière ascendante .controller
au lieu delink
partout? De sorte que je n'ai pas besoin de changer le code à l'avenir si la méthode doit être partagée ou une logique à introduire?. Y a-t-il des pièges à utilisercontroller
tout le temps au lieu du lien?Je voulais également ajouter ce que le livre O'Reily AngularJS de l'équipe Google a à dire:
la source
A
directive
vous permet d'étendre le vocabulaire HTML de manière déclarative pour créer des composants Web. L'ng-app
attribut est une directive, tout comme le sontng-controller
tous lesng- prefixed attributes
. Les directives peuvent êtreattributes
,tags
ou mêmeclass
names
,comments
.Comment naissent les directives (
compilation
etinstantiation
)Compiler: nous utiliserons la
compile
fonction à la fois dansmanipulate
le DOM avant son rendu et retournerons unelink
fonction (qui gérera la liaison pour nous). C’est aussi l’endroit où mettre toutes les méthodes qui doivent être partagées avec tous lesinstances
de cette directive.lien: Nous utiliserons la
link
fonction pour enregistrer tous les écouteurs sur un élément DOM spécifique (qui est cloné à partir du modèle) et configurer nos liaisons à la page.S'ils
objet.
compile()
étaient définis dans la fonction, ils n'auraient été définis qu'une seule fois (ce qui est souvent ce que vous voulez). S'ilslink()
étaient définis dans la fonction, ils le seraient à chaque fois que l'élément HTML est lié aux données de l'Compile
renvoie la fonctionpre
et lapost
liaison. Dans la fonction de pré-lien, nous avons le modèle d'instance et également la portée de lacontroller
, mais le modèle n'est pas lié à la portée et n'a toujours pas de contenu transclu.Post
la fonction de lien est l'endroit où le lien de publication est la dernière fonction à exécuter. Maintenant, letransclusion
est terminéthe template is linked to a scope
, et leview will update with data bound values after the next digest cycle
. L'link
option n'est qu'un raccourci pour configurer unepost-link
fonction.contrôleur: Le contrôleur de directive peut être passé à une autre phase de liaison / compilation de directive. Il peut être injecté dans d'autres directions comme moyen à utiliser dans la communication inter-directive.
Vous devez spécifier le nom de la directive à exiger - Elle doit être liée au même élément ou à son parent. Le nom peut être préfixé avec:
Utilisez un crochet
[‘directive1′, ‘directive2′, ‘directive3′]
pour exiger un contrôleur à directives multiples.la source
De plus, une bonne raison d'utiliser une fonction contrôleur vs lien (car ils ont tous les deux accès à la portée, à l'élément et aux attrs) est que vous pouvez transmettre n'importe quel service ou dépendance disponible à un contrôleur (et dans n'importe quel ordre), tandis que vous ne pouvez pas le faire avec la fonction de lien. Remarquez les différentes signatures:
contre.
la source
module.directive('myDirective', function($window) { etc...
. Vous pouvez ensuite y accéder depuis l'intérieur de la fonction de lien.ceci est un bon exemple pour comprendre les phases de la directive http://codepen.io/anon/pen/oXMdBQ?editors=101
html
la source
link
,compile
etcontroller
?require
directive d peut être injectée dans le contrôleur d'une directive dépendante?la source