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

Val*_*sin 8 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';
});
Run Code Online (Sandbox Code Playgroud)

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

0 => 0
hello => hello 
Run Code Online (Sandbox Code Playgroud)

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

PS你可以在网上试试这个样本:http://jsbin.com/otakaw/7/edit

Val*_*sin 8

根据文件:

仅当当前watchExpression和上一次调用的值watchExpression不相等时才调用侦听器 (初始运行除外,请参见下文).

在观察者注册观察者之后,异步调用监听器fn(通过$evalAsync)以初始化观察者. 在极少数情况下,这是不合需要的,因为当结果watchExpression没有改变时调用监听器.要在侦听器中检测此场景fn,您可以比较newValoldVal.如果这两个值相同(===)则由于初始化而调用了监听器.