2013-06-27 169 views
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 

它是正确的行为?当然,我可以检查值的平等,但是什么原因,如行为?

P.S.你可以试试这个样品在线:http://jsbin.com/otakaw/7/edit

+0

[$ watch可能重复后直接触发,为什么?](http://stackoverflow.com/questions/15875105/watch-is-triggered-directly-after-init-why) – Narretz

+2

请参阅部分http://docs.angularjs.org/api/ng.$ro​​otScope.Scope#$watch,你会发现你的答案 –

+0

谢谢,真的有记录。 – ValeriiVasin

回答

8

根据documentation

监听器只被调用时,从当前 watchExpression值与以前调用watchExpression不 相等(用的除外初始运行,见下文)。

后观察者与范围登记时,听者FN是 称为异步(经由$evalAsync)来初始化所述观察者。 在极少数情况下,这是不受欢迎的,因为当watchExpression的结果未发生变化时调用监听器。要在侦听器fn内检测此 方案,您可以比较newValoldVal。如果这两个值相同(===),则由于初始化而调用了监听器 。