AngularJS: Comment passer des arguments / fonctions à une directive?

Regardez ce Violon , que dois-je changer, que les expressions dans le modèle sont évaluées en utilisant les arguments que j'ai défini dans le code HTML? Le bouton de sauvegarde devrait appeler la fonction blabla() du contrôleur, puisque je le passe?

var myApp = angular.module('MyApp',[])
myApp.directive('editkeyvalue', function() {
    return {
        restrict: 'E',
        replace: true,
        scope: {
            accept: "expression"
        },
        template : '<div><label class="control-label">{{key}}</label>' +
        '<label class="control-label">{{key}}</label>' +
          '<input type="text" ng-model="value" />'+
        '<button type="button" x-ng-click="cancel()">CANCEL</button>' +
        '<button type="submit" x-ng-click="save()">SAVE</button></div>',

      controller: function($scope, $element, $attrs, $location) {
        $scope.save= function() {
          $scope.accept();
        };
      }
    }
});

Je ne vois pas vraiment à travers cela. Merci pour l'aide!

46
demandé sur Smamatti 2012-12-05 18:55:06

3 réponses

vous pouvez définir la liaison de données bidirectionnelle avec property: '=' comme Roy le suggère. Donc si vous voulez à la fois key et value lié à la portée locale vous feriez

scope: {
    key: '=',
    value: '='
},

puisque vous passez ces valeurs, vous y avez accès dans le contrôleur de votre directive. Mais dans le cas où vous souhaitez exécuter une fonction dans le contexte de la portée parent, qui semble être ce que vous voulez faire avec le accept attribut, alors vous devez dire angulaire comme ce

scope: {
    accept: "&"
}

maintenant, à partir de votre méthode save vous pouvez appeler la fonction transmise via accept

controller: function($scope, $element, $attrs, $location) {
    $scope.save= function() {      
        $scope.accept()
    };
}

voici un jsfiddle

46
répondu jaime 2012-12-05 16:16:00
scope: {
    accept: "&"
}

utilisez des lettres minuscules pour les noms de fonction, sinon ça ne marche pas.

15
répondu 2013-09-15 07:50:21

juste une petite note que vous n'avez pas besoin de la fonction d'emballage enregistrer. Il suffit de l'appeler dans le modèle:

'<button type="submit" x-ng-click="accept()">SAVE</button></div>',

qui transpose l'appel de fonction et passe les paramètres comme prévu.

Cela simplifie le code et le rend beaucoup plus facile à lire.

1
répondu Gary Blake 2015-03-30 17:54:10