2013-05-07 75 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