Je veux créer une directive liée à un attribut. L'attribut spécifie la fonction qui doit être appelée sur la portée. Mais je veux aussi passer un argument à la fonction qui est déterminée dans la fonction de lien.
<div my-method='theMethodToBeCalled'></div>
Dans la fonction de lien, je me lie à un événement jQuery, qui transmet un argument que je dois transmettre à la fonction:
app.directive("myMethod",function($parse) {
restrict:'A',
link:function(scope,element,attrs) {
var expressionHandler = $parse(attrs.myMethod);
$(element).on('theEvent',function( e, rowid ) {
id = // some function called to determine id based on rowid
scope.$apply(function() {expressionHandler(id);});
}
}
}
app.controller("myController",function($scope) {
$scope.theMethodToBeCalled = function(id) { alert(id); };
}
Sans passer l'identifiant, je peux le faire fonctionner, mais dès que j'essaye de passer un argument, la fonction n'est plus appelée
angularjs-directive
rekna
la source
la source
Réponses:
La solution de Marko fonctionne bien .
Pour contraster avec la méthode Angular recommandée (comme le montre le plunkr de treeface), il faut utiliser une expression de rappel qui ne nécessite pas de définir expressionHandler. Dans l'exemple de Marko, changez:
Dans le modèle
Dans la fonction de liaison directive
Cela présente un inconvénient par rapport à la solution de marko - lors du premier chargement, la fonctionMethodToBeCalled sera appelée avec myParam === undefined.
Un exemple de travail peut être trouvé à @treeface Plunker
la source
Juste pour ajouter quelques informations aux autres réponses - l'utilisation
&
est un bon moyen si vous avez besoin d'une portée isolée.Le principal inconvénient de la solution de marko est qu'elle vous oblige à créer une portée isolée sur un élément, mais vous ne pouvez en avoir qu'une seule sur un élément (sinon vous rencontrerez une erreur angulaire: plusieurs directives [directive1, directive2] demandant pour portée isolée )
Cela signifie que vous :
Étant donné que la question initiale utilise une directive avec les
restrict:'A'
deux situations, cela peut se produire assez souvent dans des applications plus importantes, et utiliser ici un champ d'application isolé n'est pas une bonne pratique et également inutile. En fait, rekna avait une bonne intuition dans ce cas, et l'avait presque fait fonctionner, la seule chose qu'il faisait de mal était d'appeler la fonction $ parsed de manière incorrecte (voir ce qu'elle renvoie ici: https://docs.angularjs.org/api/ ng / service / $ parse ).TL, DR; Code de question fixe
et le code
la source
$parse
.Ne sachant pas exactement ce que vous voulez faire ... mais voici toujours une solution possible.
Créez une étendue avec une propriété «&» dans la portée locale. Il "fournit un moyen d'exécuter une expression dans le contexte de la portée parent" (voir la documentation de la directive pour plus de détails).
J'ai également remarqué que vous avez utilisé une fonction de liaison abrégée et que vous y avez ajouté des attributs d'objet. Vous ne pouvez pas faire ça. Il est plus clair (à mon humble avis) de simplement renvoyer l'objet de définition de directive. Voir mon code ci-dessous.
Voici un exemple de code et un violon .
la source
Vous pouvez créer une directive qui exécute un appel de fonction avec des paramètres en utilisant
attrName: "&"
pour référencer l'expression dans la portée externe.Nous voulons remplacer la
ng-click
directive parng-click-x
:Si nous avions cette portée:
Nous pourrions écrire notre directive comme ceci:
Voici une démo en direct: http://plnkr.co/edit/4QOGLD?p=info
la source
Voici ce qui a fonctionné pour moi.
HTML utilisant la directive
Html de la directive: orderitem.directive.html
Champ d'application de la directive:
la source
Ma solution:
complete
)Directif
Composant polymère
Page
searchData
est la fonction de contrôlela source
Cela devrait fonctionner.
la source