从$digest循环的角度来看,指令与
的区别是什么?scope:{foo:'='}
和
scope:{},
controller:function($scope, $attrs}{
$scope.$watch($attrs.foo, function(foodata){$scope.foo=foodata});
}
?
虽然大多数时候这些在指令上具有相同的结果,例如template='foo={{foo}}
,并且当属性值如{x:1,y:2}
(在不同的评估中从不是===
)时两者收敛,但前者甚至收敛于{x:1,y:number}
(其中number
在作用域上从外部定义为2
),而后者最终在"10 $digest() iterations reached. Aborting!
"循环中结束。
显然它们有不同的行为,但如何使后者收敛呢?(简单地使用前一种形式有帮助,但不适用于scope:true
。)
请注意,在1.2.0到1.2.21之间,这样的表达式永远不会收敛,即使它们是完全"静态"的,并且通过'='
作用域求值。
完整的示例可以在http://plnkr.co/edit/mOhhQVPs4XqcTQ3TNMfI?p=preview上找到。
scope:{}。表示隔离作用域,可以访问作用域。$parent可以获得父作用域,但是你不能通过原型链获得继承属性。
范围:真的。表示子作用域,可以访问作用域。$parent可以获得父作用域,也可以通过原型链获得继承属性。
关于你的问题,它似乎与这个修复有关。如果你想让它的行为相同,你应该添加对象相等检查到$watch:
$scope.$watch($attrs.foo, function(foodata) {
$scope.foo=foodata;
}, true);