angularjs deux directives sur l'un des éléments
J'ai deux directives:
//Generated by CoffeeScript 1.6.3
app.directive("focusMe", function() {
return {
scope: {
focus: "=focusMe"
},
link: function(scope, element) {
return scope.$watch("focus", function(value) {
if (value === true) {
element[0].focus();
return scope.focus = false;
}
});
}
};
});
et:
//Generated by CoffeeScript 1.6.3
app.directive("cleanMe", function() {
return {
scope: {
clean: "=cleanMe"
},
link: function(scope, element) {
return scope.$watch("clean", function(value) {
if (value === true) {
element[0].value = "";
return scope.clean = false;
}
});
}
};
});
et cette entrée (angularUI):
<input type="text" ng-model="addUserSelected" typeahead="emp.value for emp in allUsers | filter:$viewValue | limitTo:5" typeahead-editable="false" typeahead-on-select="addLine($item.id)" focus-me="usersFocusInput" clean-me="usersCleanInput">
J'obtiens cette erreur:
Error: [$compile:multidir] http://errors.angularjs.org/1.2.3/$compile/multidir?p0=cleanMe&p1=focusMe&p…2%20focus-me%3D%22usersFocusInput%22%20clean-me%3D%22usersCleanInput%22%3E
que dois-je faire de mal?
Si je supprime le nettoyer-moi bien de le html, il fonctionne.
Grâce
- pourquoi ne pas vous venez de mettre à zéro le modèle que
ng-model
est lié? Je soupçonne que vous n'avez pas besoincleanMe
directive - cleanMe est pas au point, il peut y avoir 2 (ou plus) des directives. nettoyez-moi et le moi, c'est juste pour l'exemple.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de réel besoin pour des étendues de ici. L'utilisation "normale" champ d'application de la directive et de la directive sera juste d'hériter de son parent, comme ceci:
Ignorer cette partie si vous savez déjà comment l'héritage des œuvres, tout en ajoutant de l'exhaustivité:
Noter que je suis en utilisant le [attrs.focusMe].valeur, non seulement [attrs.focusMe]. La raison en est la façon dont l'héritage fonctionne en javascript. Ces directives sont enfant étendues, donc si vous essayez de faire champ d'application[attrs.focusMe] = false vous allez définir une variable locale dans le champ d'application de la directive, c'est à dire que vous n'affectera pas la portée parent (le contrôleur où il est utilisé). Cependant, si vous faites le focusMe modèle (quel qu'il soit) un objet de la portée parent, puis changer la valeur de cet objet, alors il sera pas définir une variable locale, il sera plutôt mise à jour de la mère. Donc:
Ici est une bonne réponse à propos de l'héritage si vous voulez un guide de profondeur: Quelles sont les nuances de portée prototypes /l'héritage par prototype dans AngularJS?
Vous avez deux directives qui exigent isolé portée sur le même élément qui n'est pas autorisé.
La raison de ce qui n'est pas autorisé est parce que si vous avez quelques modèles de
{{...}}
code à l'intérieur de la directive, alors il sera difficile de savoir à quelle portée il devrait prendre ses valeurs à partir d'.Considérer au lieu d'isoler la portée, à l'aide de
attribut.$observer
pour regarder lecleanMe
etfocusMe
propriétés et d'agir sur ceux-ci.et:
scope.$parent.watch(attributes['focusMe'], ...)
et définirscope.$parent[attributes['focusMe']] = false
. De même pourcleanMe
. Cela fonctionne pour vous?$scope.$parent
permettra de parer à cette erreur. Aussi, tout en remplaçant la propriété, on doit utiliser$scope.$parent
de peur que quelqu'un doit écrire correctement sur le domaine local.J'ai trouvé la solution, enfin 🙂
Dans le code html usersFocusInput et usersCleanInput sont des paramètres dans l'étendue est wht-je utiliser de la portée[attributs.focusMe] pour obtenir ce paramètre et changer pour de faux.