$使用隔离范围从内部指令监视ngModel

我正在试图从我的链接function里面看我的模型值。

scope.$watch(attrs.ngModel, function() { console.log("Changed"); }); 

当我更改控制器内的模型值时,$ watch函数不会被触发。

 $scope.myModel = "ACT"; $timeout(function() { $scope.myModel = "TOTALS"; }, 2000); 

小提琴: http : //jsfiddle.net/dkrotts/BtrZH/4/

我在这里错过了什么?

问题在于你正在$watch attrs.ngModel ,它等于“myModel”。 您的范围中没有绑定“myModel”。 你想$watch “模型”。 这是你的指示范围内的约束。 见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的延伸,尽pipe我知道这很晚了! (我还不能发表评论,所以如果这不是正确的地方,对不起!)

我不确定哪个版本的Angular OP正在使用,但在Angular#1.2 +中,至less在官方文档中https://docs.angularjs.org/api/ng/type/ngModel.NgModelController#$render,$ render是这样列出的:

当视图需要更新时调用。 预计ng-model指令的用户将实现这个方法。

在以下情况下调用$ render()方法:

$ rollbackViewValue()被调用。 如果我们将视图值回滚到最后提交的值,则调用$ render()来更新input控件。 由ng-model引用的值以编程方式更改,$ modelValue和$ viewValue都与上次不同。 由于ng-model并没有做深入的观察,所以只有在$ modelValue和$ viewValue的值与之前的值不同的情况下才会调用$ render()。

我将其解释为意味着从指令监视ngModel的正确方法是要求ngModel并实现注入ngModelController的链接函数。 然后使用内置的$ ngModel API来执行$ render-on-change($ watch),或者其他任何操作。

有两种方法可以做到这一点。

1)你可以使用$attrs.[any_attribute]并在其上设置任何监听器

2)你可以用2种方式绑定variables,并在其上设置一个监听器。如果你想要更多,这里是一个很酷的文章

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