我在 AngularJS 指令中有以下link
函数:
link: function(scope, iElement, iAttrs) {
scope.$watch('name', function(newVal){
if(newVal){
console.log(newVal);
}
}, true);
}
完整的小提琴位于:http://jsfiddle.net/balteo/K4t7P/55/
我试图找出当用户更改textarea中的$watch
变量时未调用name
函数的原因。
答案 0 :(得分:1)
在指令
上写这个时,你正在创建一个新的范围scope: {
name: '='
}
只需删除它,一切都会正常运作
关于范围属性,在docs中,我们读到:
如果设置为{}(对象哈希),则会创建一个新的“隔离”范围。 'isolate'范围与正常范围的不同之处在于它不是从父范围原型继承的。这在创建可重用组件时非常有用,这些组件不应该意外地读取或修改父范围中的数据。
= or = attr - 设置本地范围属性与通过 attr属性的值定义的名称的父范围属性之间的双向绑定。如果未指定attr名称,则假定属性名称与本地名称相同。
请注意,对于双向数据绑定,您希望将模型作为属性传递。
当你这样做时(把你的模型写成属性)它就像一个魅力(检查this fiddle)。
但是您通过ng-model
传递了您的属性。它已经在指令的范围内可用。在创建新范围时,实际上是在控制器范围创建子范围,并将其设置为链接功能中的scope
参数。事实上,如果你看$scope.$parent.name
,它也会有效(请查看this fiddle)。