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



从$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);

相关内容

  • 没有找到相关文章

最新更新