2014-08-27 63 views
2

我想了解如何在angularjs中最好地實現以下內容。

1)I有對象的數組:

$scope.myArray = [{special:false, name:'alice'}, {special:false, name:'bob'}]; 

如果myArray的[0]。特別的變化爲true時,使用$看如何檢測,這是因爲在的元素0的變化陣列。我在$ watch上讀過的所有內容都會通知數組作爲整體發生更改,但無法檢索已更改數組的元素/索引。我想有這種應對不同陣列的長度,所以它不足以只需:

$scope.watch('myArray[0].special') 

2)我有一本字典:

$scope.myValues = {id1:{special:false, name:'alice'}, id2:{special:false, name:bob'}}; 

類似的問題 - 如果我是將myValues.id1.special更改爲true,我怎麼能得到相應的名稱字段(或知道它是id1)?

我真的很感謝任何關於最佳實踐的幫助和指導,以及angularjs和$ watch(或$ watchcollection)關於數組和地圖的實際可能性。我認爲這與問題AngularJS : Watch array of objects and animate the changed property類似,但我也有興趣瞭解如何在字典中查看所有屬性。

很多人提前感謝。

+0

也許這可以幫助你回答#1:http://stackoverflow.com/questions/13980896/watching -for-data-changes-in-an-angular-directive – Ronnie 2014-08-27 22:47:24

回答

0

手錶監聽器爲您提供newValue和oldValue - 因此您需要將兩者進行比較以查看發生了什麼變化。既然你要執行價值,而不是基準比較,使用$第三個參數設置爲true觀看:

$scope.$watch('myObject', function(newVal, oldVal){ 
    // Compare newVal and oldVal here to see what has changed. 
}, true); 
+0

我認爲對於數組,這將返回newVal和oldVal的每個數組中的項目的完整列表。然後,我需要掃描每個數組,並在兩者之間進行比較。只是想知道這是否由角的某些部分自動處理,以便它會返回索引0。 – user1710407 2014-08-27 22:52:33

+0

Angular沒有辦法做到這一點恐怕 - 這種功能會很方便,但它可能會損壞性能,而不是總是需要。更重要的是,如何角度假設知道要返回什麼?如在,你想提供什麼樣的變化(完整路徑,子路徑等) – Izhaki 2014-08-27 22:55:30

+0

同意這種情況很難指定什麼樣的返回值在這種情況下。對於數組,也許它可以返回其子值已更改的最頂層對象的索引。對於我上面的例子#1,如果我把$ scope放在$ 0中,它將返回0. $ watch('myArray')。實際上,我認爲僅僅循環使用newVal數組就足夠了。 – user1710407 2014-08-27 23:12:17