Quelle est la manière la plus simple de passer une variable de portée AngularJS d'une directive à un contrôleur? Tous les exemples que j'ai vus semblent si complexes, n'y a-t-il pas un moyen d'accéder à un contrôleur à partir d'une directive et de définir l'une de ses variables de portée?
angularjs
angularjs-directive
ng-controller
winduptoy
la source
la source
Réponses:
Édité le 25/08/2014: c'est ici que je l'ai fourché.
Merci @anvarik.
Voici le jsFiddle . J'ai oublié où j'ai fourché ça. Mais ceci est un bon exemple montrant la différence entre = et @
la source
Attendez que angular ait évalué la variable
J'ai eu beaucoup de tripotages avec cela, et je n'ai pas pu le faire fonctionner même avec la variable définie avec
"="
dans la portée. Voici trois solutions en fonction de votre situation.Solution n ° 1
J'ai trouvé que la variable n'était pas encore évaluée par angulaire lorsqu'elle a été transmise à la directive. Cela signifie que vous pouvez y accéder et l'utiliser dans le modèle, mais pas à l'intérieur du lien ou de la fonction de contrôleur d'application, sauf si nous attendons qu'il soit évalué.
Si votre variable change ou est récupérée via une requête, vous devez utiliser
$observe
ou$watch
:Et voici le html (rappelez-vous les crochets!):
Notez que vous ne devez pas définir la variable
"="
dans la portée, si vous utilisez la$observe
fonction. De plus, j'ai trouvé qu'il transmettait les objets sous forme de chaînes, donc si vous passez des objets, utilisez la solution n ° 2 ouscope.$watch(attrs.yourDirective, fn)
(, ou n ° 3 si votre variable ne change pas).Solution n ° 2
Si votre variable est créée dans un autre contrôleur , par exemple , mais que vous avez juste besoin d'attendre que angular l'ait évaluée avant de l'envoyer au contrôleur d'application, nous pouvons utiliser
$timeout
pour attendre que le$apply
soit exécuté. Nous devons également l'utiliser$emit
pour l'envoyer au contrôleur d'application de la portée parent (en raison de la portée isolée dans la directive):Et voici le html (sans crochets!):
Solution n ° 3
Si votre variable ne change pas et que vous devez l'évaluer dans votre directive, vous pouvez utiliser la
$eval
fonction:Et voici le html (rappelez-vous les crochets!):
Jetez également un œil à cette réponse: https://stackoverflow.com/a/12372494/1008519
Référence pour le problème FOUC (flash of unstyled content): http://deansofer.com/posts/view/14/AngularJs-Tips-and-Tricks-UPDATED
Pour les intéressés: voici un article sur le cycle de vie angulaire
la source
ng-if="someObject.someVariable"
sur la directive (ou l'élément avec la directive comme attribut) est suffisant - la directive entre en action seulement après avoirsomeObject.someVariable
été définie.