$ watch ngModel из внутренней директивы с использованием изолированной области

Я пытаюсь посмотреть мое значение модели из моей функции привязки.

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/

Что мне здесь не хватает?

Ответ 1

Проблема заключается в том, что вы $watch ing attrs.ngModel, который равен "myModel". У вас нет "myModel", связанного в вашей области. Вы хотите $watch "model". Это то, что связано с вашей директивой. См. http://jsfiddle.net/BtrZH/5/

Ответ 2

Вам нужно будет посмотреть функцию, возвращающую $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);
           });
        }
     };
});

Здесь плункер той же идеи в действии.

Ответ 3

Правильный способ сделать это:

app.directive('myDirective', function () {
  return {
    require: 'ngModel',
    link: function (scope, element, attrs, ngModel) {

        ngModel.$render = function () {
            var newValue = ngModel.$viewValue;
            console.log(newValue)
        };

    }
  };
});

Ответ 4

Вот еще один способ сделать это:

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);  
              });
           });
        }
    };
});

Выполняя это, вы сможете прослушивать изменения значений с помощью таких привязок

Ответ 5

Это продолжение ответа @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) или что-то еще.

Ответ 6

Есть два способа сделать это.

1) Вы можете использовать $attrs.[any_attribute] и установить на нем любой прослушиватель

2) Вы можете иметь выделенную область с переменной 2 способами привязки и установить на нее прослушиватель. Если вы хотите больше, вот крутая статья

http://www.w3docs.com/snippets/angularjs/bind-variable-inside-angularjs-directive-isolated-scope.html