我想从我的链接函数内部看我的模型值。
scope.$watch(attrs.ngModel, function() {
console.log("Changed");
});
当我改变我的控制器内的模型值,不会触发$手表功能。
$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);
});
}
};
});
这里有一个plunker在行动同样的想法的。
要做到这一点,正确的方法是:
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);
});
});
}
};
});
做这样你就可以听与像结合价值变动
这是@以上灵光的答案来回答@马丁贝莱斯的延伸,虽然我知道这是相当晚了! (我也不能作出评论,因此,如果这是不是这样做的正确的地方,对不起!)
我不知道哪个角度OP的版本使用,但在角度#1.2 +至少在官方的文档https://docs.angularjs.org/api/ng/type/ngModel.NgModelController#$render ,$渲染列出这样的:
当调用视图需要更新。 据预计,该NG-模型指令的用户将实现此方法。
在$渲染()方法被调用于以下几种情况:
$ rollbackViewValue()被调用。 如果我们回滚视图值与上次提交的值,那么$渲染()被调用来更新输入控制。 吴模型参考值编程改变,无论是$ modelValue和$ viewValue距离上次不同。 由于NG-模式并不做一次深层的手表,$渲染()只援引$ modelValue和$ viewValue的值从先前的值实际上是不同的。
我解释这意味着到$从指令看的ngModel正确的做法是,要求ngModel和实施注入ngModelController链接功能。 然后使用内置的到$渲染上的变化($表)的ngModel API,或任何其他。
有2种方式来做到这一点。
1)你可以使用$attrs.[any_attribute]
和其上的任何监听器设置
2)你可以已经分离范围有2种方式结合变量,并设置你想要更多吧。如果一个听众,这里是一个很酷的文章
http://www.w3docs.com/snippets/angularjs/bind-variable-inside-angularjs-directive-isolated-scope.html