在淘汰赛中更新可观察阵列
问题描述:
我有一个名为administrators的可观察阵列。我也有一个名为adminToAdd的对象。 AdminToAdd包含一个与管理员具有完全相同属性的项目。我能够将adminToAdd推送到管理员而没有问题。在淘汰赛中更新可观察阵列
不幸的是,我无法更新管理员中的现有项目。我收到要在adminToAdd中更新的项目。我试过
vm.administrators.replace(vm.administrators.indexOf(vm.adminToAdd), vm.adminToAdd);
但虽然它们之间的结构相同,但索引不匹配。我已经看过几个例子,但没有一个适用于我的场景。有任何想法吗?
答
您的方法不起作用的原因是因为当您使用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
“adminToAdd”是一个可观察对象还是一个简单对象? – Jalayn 2013-05-07 17:53:49
具有可观察属性的对象。 – rross 2013-05-07 17:54:13