Je cherche n'importe quelle manière d'accéder à la portée "parent" dans une directive. Toute combinaison de portée, de transclude, d'exigence, de transmission de variables (ou de la portée elle-même) par le haut, etc. Je suis tout à fait disposé à se pencher en arrière, mais je veux éviter quelque chose de totalement hacky ou irréalisable. Par exemple, je sais que je pourrais le faire dès maintenant en prenant les $scope
paramètres preLink et en itérant sur ses $sibling
étendues pour trouver le "parent" conceptuel.
Ce que je veux vraiment, c'est pouvoir $watch
une expression dans la portée parent. Si je peux le faire, alors je peux accomplir ce que j'essaie de faire ici:
AngularJS - Comment rendre un partiel avec des variables?
Il est important de noter que la directive doit être réutilisable dans le même domaine parent. Par conséquent, le comportement par défaut (portée: faux) ne fonctionne pas pour moi. J'ai besoin d'une portée individuelle par instance de la directive, puis j'ai besoin d' $watch
une variable qui vit dans la portée parent.
Un exemple de code vaut 1000 mots, donc:
app.directive('watchingMyParentScope', function() {
return {
require: /* ? */,
scope: /* ? */,
transclude: /* ? */,
controller: /* ? */,
compile: function(el,attr,trans) {
// Can I get the $parent from the transclusion function somehow?
return {
pre: function($s, $e, $a, parentControl) {
// Can I get the $parent from the parent controller?
// By setting this.$scope = $scope from within that controller?
// Can I get the $parent from the current $scope?
// Can I pass the $parent scope in as an attribute and define
// it as part of this directive's scope definition?
// What don't I understand about how directives work and
// how their scope is related to their parent?
},
post: function($s, $e, $a, parentControl) {
// Has my situation improved by the time the postLink is called?
}
}
}
};
});
la source
scope.$watch('localName3', function() { ...[?? WHAT TO DO HERE for example?] });
$parse
avec=
: violon .$parse
n'est nécessaire qu'avec les étendues non isolées.Accéder à la méthode du contrôleur signifie accéder à une méthode sur la portée parent à partir de la directive contrôleur / lien / portée.
Si la directive partage / hérite de la portée parent, il est assez simple d'appeler simplement une méthode de portée parent.
Un peu plus de travail est requis lorsque vous souhaitez accéder à la méthode de portée parent à partir de la portée de directive isolée.
Il y a peu d'options (peut-être plus que celles listées ci-dessous) pour invoquer une méthode de portée parent à partir de la portée des directives isolées ou regarder les variables de portée parent ( option # 6 spécialement).
Notez que j'ai utilisé
link function
dans ces exemples, mais vous pouvez également utiliser undirective controller
en fonction des besoins.Option 1. Par le biais du littéral objet et du modèle de directive html
index.html
itemfilterTemplate.html
app.js
plnkr de travail: http://plnkr.co/edit/rgKUsYGDo9O3tewL6xgr?p=preview
Option 2. Par le biais d'un littéral d'objet et d'un lien / portée de directive
index.html
itemfilterTemplate.html
app.js
plnkr de travail: http://plnkr.co/edit/BRvYm2SpSpBK9uxNIcTa?p=preview
Option n ° 3. Par référence à la fonction et à partir du modèle de directive html
index.html
itemfilterTemplate.html
app.js
plnkr de travail: http://plnkr.co/edit/Jo6FcYfVXCCg3vH42BIz?p=preview
Option n ° 4. Par référence à la fonction et par lien / champ d'application de la directive
index.html
itemfilterTemplate.html
app.js
plnkr de travail: http://plnkr.co/edit/BSqx2J1yCY86IJwAnQF1?p=preview
Option n ° 5: via ng-model et la liaison bidirectionnelle, vous pouvez mettre à jour les variables de portée parent. . Par conséquent, vous n'aurez peut-être pas besoin d'appeler les fonctions de portée parent dans certains cas.
index.html
itemfilterTemplate.html
app.js
plnkr de travail: http://plnkr.co/edit/hNui3xgzdTnfcdzljihY?p=preview
Option # 6: Through
$watch
et$watchCollection
c'est une liaison bidirectionnelle pouritems
dans tous les exemples ci-dessus, si les éléments sont modifiés dans la portée parent, les éléments dans la directive refléteraient également les changements.Si vous souhaitez regarder d'autres attributs ou objets de la portée parent, vous pouvez le faire en utilisant
$watch
et$watchCollection
comme indiqué ci-dessoushtml
script app.js
var app = angular.module ('plunker', []);
Vous pouvez toujours consulter la documentation AngularJs pour des explications détaillées sur les directives.
la source
et vous aurez la même portée (avec l'élément parent)
Il existe de nombreuses façons d'accéder à la portée parent en fonction de ces deux options, portée et transclude.
la source
Voici une astuce que j'ai utilisée une fois: créer une directive "factice" pour contenir la portée parent et la placer quelque part en dehors de la directive souhaitée. Quelque chose comme:
puis
Ce n'est peut-être pas la solution la plus gracieuse, mais elle a fait le travail.
la source
Si vous utilisez les classes et la
ControllerAs
syntaxe ES6 , vous devez faire quelque chose de légèrement différent.Voir l'extrait ci-dessous et notez qu'il
vm
s'agit de laControllerAs
valeur du contrôleur parent telle qu'elle est utilisée dans le code HTML parentla source
Après avoir tout essayé, j'ai finalement trouvé une solution.
Placez simplement ce qui suit dans votre modèle:
{{currentDirective.attr = parentDirective.attr; ''}}
Il écrit simplement l'attribut / variable de portée parent auquel vous souhaitez accéder à la portée actuelle.
Notez également le
; ''
à la fin de l'instruction, c'est pour vous assurer qu'il n'y a pas de sortie dans votre modèle. (Angular évalue chaque instruction, mais ne produit que la dernière).C'est un peu hacky, mais après quelques heures d'essais et d'erreurs, il fait l'affaire.
la source