2013-05-07 108 views
0

我有一個名爲administrators的可觀察陣列。我也有一個名爲adminToAdd的對象。 AdminToAdd包含一個與管理員具有完全相同屬性的項目。我能夠將adminToAdd推送到管理員而沒有問題。在淘汰賽中更新可觀察陣列

不幸的是,我無法更新管理員中的現有項目。我收到要在adminToAdd中更新的項目。我試過

vm.administrators.replace(vm.administrators.indexOf(vm.adminToAdd), vm.adminToAdd); 

但雖然它們之間的結構相同,但索引不匹配。我已經看過幾個例子,但沒有一個適用於我的場景。有任何想法嗎?

+0

「adminToAdd」是一個可觀察對象還是一個簡單對象? – Jalayn 2013-05-07 17:53:49

+0

具有可觀察屬性的對象。 – rross 2013-05-07 17:54:13

回答

1

您的方法不起作用的原因是因爲當您使用indexOf來試圖找到一個對象而不是一個值。當找到一個對象時,它使用內存地址來決定平等而不是對象的值。

對於類似情況我喜歡ko的效用函數ko.utils.arrayFirst(array, predicate)。這允許您搜索數組中的特定項目並在找到時返回它。您提供了一個謂詞函數,該函數將在對象相等或爲其他任何內容爲false時返回true。

var existingItem = ko.utils.arrayFirst(vm.administrators(), function (item) { 
    return <true or false statement> //define what constitutes equal here; 
}); 

if (existingItem) { 
    vm.administrators.remove(existingItem); 
    vm.administrators.push(vm.adminToAdd()); 
} 
else { 
    //case where it wasn't in the array 
} 
+0

@rross不能確定'administrators'裏面的對象本身是否是可觀察對象,但如果是這種情況,我可以更新示例。 – 2013-05-07 18:03:55