Bon moyen de passer des fonctions de la directive pour l'exécution en lien
Je sais que nous avons l'habitude de passer des fonctions de directives par le biais d'un isolé portée:
.directive('myComponent', function () {
return {
scope:{
foo: '&'
}
};
})
Et ensuite dans le modèle, nous pouvons appeler cette fonction comme tel:
<button class="btn" ng-click="foo({ myVal: value })">Submit</button>
Où myVal
est le nom du paramètre de la fonction foo
dans la portée parent prend.
Maintenant, si j'ai l'intention de l'utiliser depuis le link
fonction au lieu de modèle, je vais devoir l'appeler avec: scope.foo()(value)
, depuis scope.foo
sert comme un wrapper de la fonction d'origine. Cela semble un peu fastidieux pour moi.
Si je passe la fonction de la myComponent
directive à l'aide de =
:
.directive('myComponent', function () {
return {
scope:{
foo: '='
}
};
})
Alors je vais être en mesure de l'utiliser juste scope.foo(value)
de ma fonction de lien. Alors, est-ce valable de cas d'utilisation pour utiliser 2 voies de liaison sur les fonctions, ou suis-je en train de faire une sorte de hack que je ne devrais pas être en train de faire?
J'hésite car 2 voies de liaison semble être conçu pour le modèle de données, mais je l'utilise sur une fonction. En général, ces fonctions ne sont pas censés être changé de toute façon.
OriginalL'auteur Xavier_Ex | 2015-04-24
Vous devez vous connecter pour publier un commentaire.
Ici, c'est pourquoi je downvoted la réponse.
Tout d'abord, vous ne devriez jamais utiliser le '=' pour passer à la fonction des références à des directives.
'=' crée deux montres et les utilise pour s'assurer que la directive de l'étendue et de la portée parent références sont les mêmes dans les deux sens de la liaison). C'est une très mauvaise idée que de permettre à une directive visant à modifier la définition d'une fonction dans votre parent, qui est ce qui se passe lorsque vous utilisez ce type de liaison. Aussi, les montres doivent être réduites au minimum, même si cela fonctionne, les deux extra $montres sont inutiles. Donc, il n'est pas bien, une partie de la baisse de vote a été pour ce qui suggère que c'était.
Deuxième - la réponse déforme ce que " &". & n'est pas un moyen de liaison". Il obtient que les abus de langage tout simplement parce que, contrairement '=', il ne crée pas de $de montres et de modification de la valeur de la propriété dans le champ d'application de la directive ne se propagent pas à la société mère.
Selon les docs:
Lorsque vous utilisez le & dans une directive, il génère une fonction qui retourne la valeur de l'expression évaluée à l'encontre de la portée parent. L'expression n'a pas à être un appel de fonction. Il peut être valable, toute angulaire de l'expression. En outre, cela a généré fonction prend un argument d'objet qui peuvent modifier la valeur d'une variable locale a trouvé dans l'expression.
D'étendre l'OP exemple, supposons que le parent utilise cette directive de la manière suivante:
Dans la directive (modèle ou de la fonction de lien), si vous appelez
Ce que vous faites est l'évaluation de l'expression "aller()", ce qui arrive d'appeler la fonction "go" sur la portée parent, en passant pas d'arguments.
Sinon,
Vous êtes l'évaluation de l'expression "aller(valeur)" sur la portée parent, qui est essentiellement l'appel de $parent.aller($parent.valeur)"
Vous êtes l'évaluation de l'expression "aller(myVal)", mais avant que l'expression est évaluée, myVal sera remplacé par 42, de sorte que l'expression évaluée sera "go(42)".
Dans ce cas, $champ d'application.foo({myVal: 42}) renvoie le résultat de:
Essentiellement, ce modèle permet la directive, à "injecter" des variables que le consommateur de la directive peut éventuellement utiliser dans les foo expression.
Vous pourriez faire ceci:
et dans la directive:
$champ d'application.foo() permettra d'évaluer l'expression "aller", qui renvoie une référence à l' $parent.aller à la fonction. Il va ensuite appeler comme $parent.aller(42). L'inconvénient de ce modèle est que vous obtenez un message d'erreur si l'expression n'évalue pas à une fonction.
La dernière raison de la baisse de vote était l'affirmation que le ng-événement directives utiliser &. Ce n'est pas le cas. Aucun des la construction dans les directives de créer isolé étendues avec:
La mise en œuvre de la "&foo' est (simplifié pour plus de clarté), se résume à:
La mise en œuvre de ng-click est similaire, mais (aussi simplifié):
De sorte que la clé à se rappeler est que lorsque vous utilisez '&', vous n'êtes pas passage d'une fonction - vous êtes de passage à une expression. La directive peut obtenir le résultat de cette expression à tout moment en appelant la fonction générée.
$scope.foo()(42)
est un anti-modèle qui n'a guère de sens. Enfin,ngRepeat
ne crée pas un cas isolé portée (ni ng-cliquez sur et pour la plupart construites dans la directive, que je vous donne, mon mauvais), de sorte que l'utilisateur peut toujours utiliser ce qui existait avant sur son champ d'application. Vous pourriez avoir édité ma réponse plutôt que de dupliquer les explications pour mieux servir la communauté.(correction, j'ai enlevé mon downvote, de ne pas jouer à ce jeu)
Que faire si la fonction est une sorte de rappel? I. e. elle doit être appelée avec les paramètres spécifiés dans la directive
link
fonction. Est-il possible d'utiliser=
dans une telle situation?Si par callback, vous dire que votre fonction de lien dans votre directive veut appeler une fonction déclarée sur la portée parent, alors mon conseil s'applique toujours. Si vous pouvez m'indiquer un plunkr qui montre ce que vous essayez d'accomplir, je peux être plus précis.
OriginalL'auteur Joe Enzminger
Liaison bidirectionnelle de passer une fonction est très bien aussi longtemps que votre fonction sera de prendre toujours les mêmes paramètres dans le même ordre. Mais aussi inutile.
La voie de liaison est plus efficace et permet d'appeler une fonction avec un paramètre et dans n'importe quel ordre, et d'offrir plus de visibilité dans le code HTML. Par exemple, nous ne pouvions pas imaginer
ngClick
être une liaison bidirectionnelle: parfois, vous voulez quelque chose comme<div ng-click="doStuff(var1)">
jusqu'à des choses plus complexes commeVoir: vous pouvez manipuler les paramètres directement à partir de l'HTML.
Maintenant je pense que vous avez mal compris comment utiliser les liaisons. Si vous avez en effet définir
onFoo: '&'
dans votre directive, puis, à partir de la fonction de lien que vous devez faire par exemple:Donc dans le HTML, vous pouvez utiliser
Note que vous avez accès non seulement à toutes les propriétés de la directive isolé portée (
bar
), mais aussi le "habitants", a ajouté au moment de l'appel (extra
).Votre notation comme
scope.foo()(value)
ressemble à un hack pour moi, ce n'est pas le itended façon à utiliser de fixations.Remarque: d'une manière liaisons sont généralement utilisés avec certains "cas" des fonctions telles que
when-drop
,on-leave
,ng-click
,when-it-is-loaded
, etc.Merci @Xavier_Ex, je serais curieux à ce sujet ainsi. Si je suis mal, je suis impatient de savoir ce que font exactement.
OriginalL'auteur floribon