Angularjs 为什么a'=';作用域绑定的行为与$watch不同?

Angularjs 为什么a'=';作用域绑定的行为与$watch不同?,angularjs,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}(在不同的求值中从来都不是==)时,它们都会收敛,而

从$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()迭代。正在中止!
”循环

显然,它们有不同的行为,但即使是后一种行为,如何使其收敛?(简单地使用前一种形式会有所帮助,但不适用于
scope:true

请注意,在1.2.0和1.2.21之间的某一点上,这样的表达式永远不会收敛,即使它们是完全“静态”的,并通过
'='
范围进行计算


可以在上找到完整的示例。

作用域:{}。意味着隔离作用域,您可以访问作用域。$parent以获取父作用域,但不能通过原型链获取继承的属性

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

关于您的问题,它似乎与此有关。如果您希望其表现相同,则应将对象相等性检查添加到$watch中:

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