8

我有一个代码片段:

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 

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

PS您可以在线尝试此示例:http: //jsbin.com/otakaw/7/edit

4

1 回答 1

8

根据文件

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

在观察者注册到作用域后,监听器 fn 被异步调用(通过$evalAsync)来初始化观察者。 在极少数情况下,这是不可取的,因为在没有更改的结果时调用了侦听器watchExpression。要在侦听器中检测这种情况fn可以比较newValoldVal。如果这两个值相同(===),则由于初始化而调用了侦听器。

于 2013-06-27T09:35:53.180 回答