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

AngularJS $watch strange behavior during controller initialization

本文关键字:观察 控制器 初始化 AngularJS      更新时间:2023-09-26

我有一个代码片段:

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 

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

附言:你可以在线试用这个样品:http://jsbin.com/otakaw/7/edit

根据文档:

只有当当前watchExpression和上一次对watchExpression的调用不是equal(,初始运行除外,请参阅下文)。

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