Ответ 1
Проблема заключается в том, что вы $watch
ing attrs.ngModel
, который равен "myModel". У вас нет "myModel", связанного в вашей области. Вы хотите $watch
"model". Это то, что связано с вашей директивой. См. http://jsfiddle.net/BtrZH/5/
Я пытаюсь посмотреть мое значение модели из моей функции привязки.
scope.$watch(attrs.ngModel, function() {
console.log("Changed");
});
Когда я изменяю значение модели внутри своего контроллера, функция $watch не запускается.
$scope.myModel = "ACT";
$timeout(function() {
$scope.myModel = "TOTALS";
}, 2000);
Fiddle: http://jsfiddle.net/dkrotts/BtrZH/4/
Что мне здесь не хватает?
Проблема заключается в том, что вы $watch
ing attrs.ngModel
, который равен "myModel". У вас нет "myModel", связанного в вашей области. Вы хотите $watch
"model". Это то, что связано с вашей директивой. См. http://jsfiddle.net/BtrZH/5/
Вам нужно будет посмотреть функцию, возвращающую $modelValue, которую вы смотрите.
В следующем коде показан базовый пример:
app.directive('myDirective', function (){
return {
require: 'ngModel',
link: function(scope, element, attrs, ngModel) {
scope.$watch(function () {
return ngModel.$modelValue;
}, function(newValue) {
console.log(newValue);
});
}
};
});
Здесь плункер той же идеи в действии.
Правильный способ сделать это:
app.directive('myDirective', function () {
return {
require: 'ngModel',
link: function (scope, element, attrs, ngModel) {
ngModel.$render = function () {
var newValue = ngModel.$viewValue;
console.log(newValue)
};
}
};
});
Вот еще один способ сделать это:
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);
});
});
}
};
});
Выполняя это, вы сможете прослушивать изменения значений с помощью таких привязок
Это продолжение ответа @Emmanuel выше, чтобы ответить @Martin Velez, хотя я знаю это довольно поздно! (Также я не могу комментировать, поэтому, если это не подходящее место для этого, извините!)
Я не уверен, какая версия Angular OP использовалась, но в Angular # 1.2 +, по крайней мере, на официальных документах https://docs.angularjs.org/api/ng/type/ngModel.NgModelController#$render, $render отображается следующим образом:
Вызывается, когда представление необходимо обновить. Ожидается, что пользователь директивы ng-model будет реализовывать этот метод.
Метод $render() вызывается в следующих ситуациях:
Вызывается$rollbackViewValue(). Если мы откатываем представление к последнему зафиксированному значению, то вызывается $render() для обновления управление вводом. Значение, на которое ссылается ng-модель, изменяется программно, и как $modelValue, так и $viewValue являются отличается от последнего времени. Поскольку ng-модель не делает глубоких наблюдений, $render() вызывается только в том случае, если значения $modelValue и $viewValue фактически отличаются от их предыдущего значения.
Я интерпретирую это как означающее, что правильный способ $смотреть ngModel из директивы - это требовать ngModel и реализовать функцию связи, которая вводит ngModelController. Затем используйте API ngModel, который встроен в $render-on-change ($ watch) или что-то еще.
Есть два способа сделать это.
1) Вы можете использовать $attrs.[any_attribute]
и установить на нем любой прослушиватель
2) Вы можете иметь выделенную область с переменной 2 способами привязки и установить на нее прослушиватель. Если вы хотите больше, вот крутая статья