范围。$ watch未被AngularJS指令调用

时间:2014-02-21 14:20:07

标签: angularjs angularjs-directive

我在 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函数的原因。

1 个答案:

答案 0 :(得分:1)

在指令

上写这个时,你正在创建一个新的范围
scope: {
    name: '='
}

只需删除它,一切都会正常运作

Fiddle

说明

关于范围属性,在docs中,我们读到:

  

如果设置为{}(对象哈希),则会创建一个新的“隔离”范围。 'isolate'范围与正常范围的不同之处在于它不是从父范围原型继承的。这在创建可重用组件时非常有用,这些组件不应该意外地读取或修改父范围中的数据。

     

= or = attr - 设置本地范围属性与通过 attr属性的值定义的名称的父范围属性之间的双向绑定。如果未指定attr名称,则假定属性名称与本地名称相同。

请注意,对于双向数据绑定,您希望将模型作为属性传递。

当你这样做时(把你的模型写成属性)它就像一个魅力(检查this fiddle)。

但是您通过ng-model传递了您的属性。它已经在指令的范围内可用。在创建新范围时,实际上是在控制器范围创建子范围,并将其设置为链接功能中的scope参数。事实上,如果你看$scope.$parent.name,它也会有效(请查看this fiddle)。