2013-06-27 275 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。如果這兩個值相同(===),則由於初始化而調用了監聽器 。