AngularJS $在控制器初始化期间观察奇怪的行为

时间:2013-06-27 08:57:05

标签: javascript angularjs

我有一个代码段:

var app = angular.module('Demo', []);

app.controller('DemoCtrl', function ($scope) {
  function notify(newValue, oldValue) {
    console.log('%s => %s', oldValue, newValue);
  }

  $scope.$watch('collection.length', notify);
  $scope.$watch('my', notify);

  $scope.collection = [];  
  $scope.my = 'hello';
});

$watch最初开火。此代码段将输出:

0 => 0
hello => hello 

这是正确的行为吗?当然,我可以检查值是否相等,但是行为的原因是什么?

P.S。您可以在线试用此示例:http://jsbin.com/otakaw/7/edit

1 个答案:

答案 0 :(得分:8)

根据documentation

仅当来自当前的值时才调用侦听器 watchExpression以及先前对watchExpression的调用不是 相等(除了初始运行,见下文)。

在观察者注册范围后,监听器fn是 异步调用(通过$evalAsync)初始化观察者。 在极少数情况下,这是不受欢迎的,因为当watchExpression的结果未发生变化时调用了侦听器。要检测到这一点 监听器fn中的场景,您可以比较newValoldVal。如果这两个值相同(===)那么听众就是 由于初始化而被调用。