J'essaie de regarder la valeur de mon modèle de l'intérieur de ma fonction de liaison.
scope.$watch(attrs.ngModel, function() {
console.log("Changed");
});
Lorsque je modifie la valeur du modèle dans mon contrôleur, la fonction $ watch n'est pas déclenchée.
$scope.myModel = "ACT";
$timeout(function() {
$scope.myModel = "TOTALS";
}, 2000);
Violon: http://jsfiddle.net/dkrotts/BtrZH/4/
Qu'est-ce que j'oublie ici?
Le problème est que vous $watch
ing attrs.ngModel
qui est égal à "myModel". Vous n'avez pas "myModel" lié dans votre portée. Tu veux $watch
"modèle". C'est ce qui est lié au champ d'application de votre directive. Voir http://jsfiddle.net/BtrZH/5/
Vous aurez besoin de regarder une fonction qui retourne la $ modelValue que vous regardez.
Le code suivant montre un exemple de base:
app.directive('myDirective', function (){
return {
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
scope.$watch(function () {
return ngModel.$modelValue;
}, function(newValue) {
console.log(newValue);
});
}
};
});
Voici un plunker de la même idée en action.
La bonne façon de faire est:
app.directive('myDirective', function () {
return {
require: 'ngModel',
link: function (scope, element, attrs, ngModel) {
ngModel.$render = function () {
var newValue = ngModel.$viewValue;
console.log(newValue)
};
}
};
});
Voici une autre façon de faire ceci:
app.directive('myDirective', function (){
return {
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
attrs.$observe('ngModel', function(value){ // Got ng-model bind path here
scope.$watch(value,function(newValue){ // Watch given path for changes
console.log(newValue);
});
});
}
};
});
En procédant de cette façon, vous pourrez écouter les changements de valeur avec des liaisons comme celle-ci.
Ceci est une extension de la réponse de @ Emmanuel ci-dessus pour répondre à @Martin Velez, bien que je sache qu'il est assez tard! (Aussi, je ne peux pas encore faire de commentaires, donc si ce n'est pas le bon endroit pour ça, désolé!)
Je ne sais pas quelle version de Angular OP utilisait, mais dans Angular # 1.2 + au moins sur la documentation officielle https://docs.angularjs.org/api/ ng/type/ngModel.NgModelController # $ render , $ render est listé comme ceci:
Appelé lorsque la vue doit être mise à jour. Il est prévu que l'utilisateur de la directive ng-model implémentera cette méthode.
La méthode $ render () est invoquée dans les situations suivantes:
$ rollbackViewValue () est appelé. Si nous rétablissons la valeur d'affichage à la dernière valeur validée, $ render () est appelé pour mettre à jour le contrôle d'entrée. La valeur référencée par ng-model est modifiée par programme et les valeurs $ modelValue et $ viewValue sont différentes de la dernière fois. Comme ng-model ne fait pas une surveillance approfondie, $ render () est invoqué uniquement si les valeurs de $ modelValue et $ viewValue sont réellement différentes de leur valeur précédente.
J'interprète cela comme signifiant que la bonne façon de surveiller un ngModel à partir d'une directive est de demander à ngModel et d'implémenter une fonction de lien qui injecte ngModelController. Utilisez ensuite l’API ngModel intégrée à $ render-on-change ($ watch), ou à d’autres activités.
Il y a 2 façons de le faire.
1) Vous pouvez utiliser $attrs.[any_attribute]
et mettre dessus n'importe quel auditeur
2) Vous pouvez avoir une portée isolée avec une variable 2 manières et définir un écouteur dessus. Si vous en voulez plus, voici un article intéressant