2015-07-28 105 views
1

我一直在使用$ watchGroup來觀察一系列的字段並觸發一系列的功能,具體取決於某個特定字段是否已被更改。

我設置了以下plnkr來演示我遇到的意外行爲。

$scope.$watchGroup(['first', 'second', 'third'], function(newValues, oldValues) 
    { 
    var message = 
    { 
     first: newValues[0], 
     second: newValues[1], 
     third: newValues[2], 
     firstOld: oldValues[0], 
     secondOld: oldValues[1], 
     thirdOld: oldValues[2] 
    }; 

    if(newValues[0] !== oldValues[0]){ 
     console.log('First changed') 
    } 

    if(newValues[1] !== oldValues[1]){ 
     console.log('Second changed') 
    } 

    if(newValues[2] !== oldValues[2]){ 
     console.log('Third changed') 
    } 

    $scope.messages.push(message); 
    }); 

該場景涉及三個觀看的領域,我想觸發一個功能取決於哪個領域已經改變。我一直在使用'newValues'和'oldValues'來監視哪個字段發生了變化。

我碰上了,問題是,如果我已經改變了「二」字段,然後去改「第一」或「第三」字段,將觸發「第二」功能作爲其存儲先前「 newValues'和'oldValues',這使得它看起來像「Second」字段已經改變,如此image中所示。

我突出了圖片中的異常。我希望一旦我開始改變「第三」領域,「第二」的'newValues'和'oldValues'就像它不是場改變一樣。

我知道我可以堅持兩個級別的舊值,並比較它們來解決這個問題,但我希望它能像我所描述的那樣工作。任何澄清,如果這是一個錯誤或預期的功能,將不勝感激。

$ watchGroup的angular文檔聲明watchExpressions是一個「將使用$ watch()」單獨觀看的表達式數組。這使我認爲這不是預期的功能。

+0

我在與一些類似的問題,我正在確認並且希望能夠分辨哪個watchExpression觸發了$ watchGroup偵聽器函數。想聽聽這個解決方案! –

回答

0

由角文檔爲$去觀看組和它內部使用$看每一個人表達我想你看到的是預期的行爲

從文檔爲$ watchGroup,

* The `newValues` array contains the current values of the `watchExpressions`, with the indexes matching 
    * those of `watchExpression` 
    * and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching 
    * those of `watchExpression` 

因此,新值始終只有最新值,舊值包含之前的值。其次,$ watchGroup在內部調用$ watch [並且您看到的是與手錶相同的行爲]。 $ watch更新最後一個值和當前值,然後只在當前值與上一個值不同時調用偵聽器函數。因此,在這種情況下,例如,當您在'second'表達式後更新'first'表達式時,不會爲'second'表達式調用偵聽器函數,而舊值仍然是'second value'。

如果您的監聽器功能真的取決於哪個表達式發生了變化,那麼您最好使用$ watch而不是$ watchGroup [恕我直言,我沒有看到性能差異,因爲$ watch將被觸發對於所有表達式]。但是如果你想調用一個普通的處理器並且傳遞所有新值,而不管哪個表達式已經改變,那麼你可以去$ watchGroup。

所有說,將它仍然是好的,如果你可以發佈這組角,並得到它從「馬嘴」 :)