2014-05-06 69 views
1

任何人都可以解釋爲什麼$ watch()爲我的範圍解僱,即使newValue == oldValue在這裏?

scope.$watch('element', function(newValue, oldValue) { 
    if (newValue == oldValue) { 
     console.log(newValue == oldValue); 
     return; 
    } 
}, true); 

「真」,且輸出NEWVALUE和屬性oldValue是具有相同的值的兩個對象:

{"formID":"536826128a1c00617d3e4c5f","elementType":"TextFieldElement","required":false,"note":"","label":"","fieldName":"","_id":"5368261b8a1c00617d3e4c60","__v":0,"$$hashKey":"01B"} 
{"formID":"536826128a1c00617d3e4c5f","elementType":"TextFieldElement","required":false,"note":"","label":"","fieldName":"","_id":"5368261b8a1c00617d3e4c60","__v":0,"$$hashKey":"01B"} 

我從傳遞「真」的第三個參數$腕錶docs理解比較對於使用angular.equals()的對象相等。我還用angular.equals()進行了測試,並且它也返回true。那麼爲什麼$ watch()被觸發呢?

我正在使用AngularJS v1.2.16。

+1

是否只有一次?這確實發生在init上,文檔說通過比較oldVal和newVal來檢查它。 – aet

+0

是的,它似乎只發生在初始化,這似乎是問題。我在文檔中忽略了這一點。在監聽器中使用===檢查解決了這個問題。如果您想在此發佈答案,我很樂意將其標記爲答案。 –

+0

謝謝!很高興我能幫上忙。 – aet

回答

4

每角文檔,這可能發生在初始化:

後一位守望與範圍,FN異步調用(通過$ evalAsync)來初始化觀察者註冊到監聽。在極少數情況下,這是不可取的,因爲當watchExpression的結果沒有改變時調用監聽器。要在偵聽器fn中檢測到這種情況,可以比較newVal和oldVal。如果這兩個值相同(===),則由於初始化而調用偵聽器。

相關問題