为什么' ='范围绑定的行为与$ watch不同?

时间:2014-08-21 13:57:13

标签: angularjs

什么是,从$ 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上找到完整的示例。

1 个答案:

答案 0 :(得分:0)

范围:{}。表示隔离范围,您可以访问范围。$ parent获取父范围,但您不能通过原型链获得继承属性。

范围:true。表示子范围,您可以访问范围。$ parent获取父范围,还可以通过原型链获得继承属性。

关于您的问题,它似乎与此fix有关。如果您希望它的行为相同,您应该将对象相等性检查添加到$ watch:

  $scope.$watch($attrs.foo, function(foodata) {
    $scope.foo=foodata;
  }, true);