我有一个名为administrators的可观察数组。我还有一个名为adminToAdd的对象。 AdminToAdd包含一个与管理员具有完全相同属性的项目。我可以将adminToAdd推送到管理员而没有任何问题。
不幸的是,我无法更新管理员中的现有项目。我收到了要在adminToAdd中更新的项目。我试过了
vm.administrators.replace(vm.administrators.indexOf(vm.adminToAdd), vm.adminToAdd);
但是虽然它们之间的结构相同但索引不匹配。我看了几个例子,但似乎没有一个适用于我的场景。有任何想法吗?
答案 0 :(得分: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
}