J'ai un exemple angularJS
<div ng-controller="testCtrl">
<test color1="color1" updateFn="updateFn()"></test>
</div>
<script>
angular.module('dr', [])
.controller("testCtrl", function($scope) {
$scope.color1 = "color";
$scope.updateFn = function() {
alert('123');
}
})
.directive('test', function() {
return {
restrict: 'E',
scope: {color1: '=',
updateFn: '&'},
template: "<button ng-click='updateFn()'>Click</button>",
replace: true,
link: function(scope, elm, attrs) {
}
}
});
</script>
</body>
</html>
Je veux que lorsque je clique sur le bouton, la boîte d'alerte apparaît, mais rien ne s'affiche.
Quelqu'un peut-il m'aider?
replace
attribut est obsolète dans AngularJS: stackoverflow.com/questions/24194972/…updateFn({msg: 'my message'});
doit être utilisé dans ce format lors de l'appel de fonction à l'intérieur de lalink
fonction de la directive .Il me manque peut-être quelque chose, mais bien que les autres solutions appellent la fonction de portée parent, il n'y a pas de possibilité de passer des arguments à partir du code de directive, c'est parce que l'
update-fn
appel estupdateFn()
avec des paramètres fixes, par exemple{msg: "Hello World"}
. Un léger changement permet à la directive de transmettre des arguments, ce que je pense être beaucoup plus utile.Notez que le HTML passe une référence de fonction, c'est-à-dire sans
()
crochets.JS
Ainsi, dans ce qui précède, le HTML appelle la
callUpdate
fonction de portée locale , qui `` récupère '' ensuite le updateFn de la portée parent et appelle la fonction retournée avec des paramètres que la directive peut générer.http://jsfiddle.net/mygknek2/
la source
ng-click="updateFn()('Directive Args')"
Dans votre balise Html directive 'test', le nom d'attribut de la fonction ne doit pas être camelCased, mais basé sur des tirets.
donc - au lieu de:
écrire:
C'est la manière angulaire de faire la différence entre les attributs de directive (comme la fonction update-fn) et les fonctions.
la source
Que diriez-vous de passer la fonction de contrôleur avec la liaison bidirectionnelle ? Ensuite, vous pouvez l'utiliser dans la directive exactement de la même manière que dans un modèle normal (j'ai supprimé les parties non pertinentes pour plus de simplicité):
J'ai atterri à cette question, parce que j'ai essayé la méthode ci-dessus befire, mais cela n'a pas fonctionné. Maintenant, cela fonctionne parfaitement.
la source
utilisez le tiret et les minuscules pour le nom de l'attribut (comme l'ont dit d'autres réponses):
Et utilisez "=" au lieu de "&" dans la portée de la directive:
Ensuite, vous pouvez utiliser updateFn comme toute autre fonction:
Voilà!
la source
update-fn="updateFn"
J'ai dû utiliser la liaison "=" au lieu de "&" car cela ne fonctionnait pas. Comportement étrange.
la source
update-fn="updateFn()"
vous devez inclure les parenthèses (et peut-être les paramètres). Le passer en tant que référence de fonctionupdate-fn="updateFn"
ne fonctionnera pas avec la&
liaison@JorgeGRC Merci pour votre réponse. Une chose cependant, la partie «peut-être» est très importante. Si vous avez des paramètres, vous devez également les inclure dans votre modèle et vous assurer de spécifier vos sections locales, par exemple
updateFn({msg: "Directive Args"}
.la source