Regardez ce violon , que dois-je changer, pour que les expressions du modèle soient évaluées à l'aide des arguments que j'ai définis dans le code HTML? Le bouton SAVE 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!
Vous pouvez définir une liaison de données bidirectionnelle avec property: '='
, Comme le suggère Roy. Donc, si vous voulez que key
et value
soient liés à la portée locale, vous feriez
scope: {
key: '=',
value: '='
},
Puisque vous transmettez ces valeurs, vous y avez accès dans le contrôleur de votre directive. Mais si vous souhaitez exécuter une fonction dans le contexte de la portée parente, ce qui semble être ce que vous voulez faire avec l'attribut accept
, vous devez indiquer angular comme ceci:
scope: {
accept: "&"
}
Maintenant, depuis 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
scope: {
accept: "&"
}
Utilisez des lettres minuscules pour les noms de fonction, sinon cela ne fonctionnera pas.
Juste une note rapide indiquant que vous n’avez pas besoin de la fonction d’enregistrement. Il suffit d'appeler cela dans le modèle:
'<button type="submit" x-ng-click="accept()">SAVE</button></div>',
Cela transpose l'appel de fonction et transmet les paramètres comme prévu.
Cela simplifie le code et le rend beaucoup plus facile à lire.