在knockout中更新可观察数组

时间:2013-05-07 17:44:26

标签: javascript knockout.js knockout-2.0

我有一个名为administrators的可观察数组。我还有一个名为adminToAdd的对象。 AdminToAdd包含一个与管理员具有完全相同属性的项目。我可以将adminToAdd推送到管理员而没有任何问题。

不幸的是,我无法更新管理员中的现有项目。我收到了要在adminToAdd中更新的项目。我试过了

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

但是虽然它们之间的结构相同但索引不匹配。我看了几个例子,但似乎没有一个适用于我的场景。有任何想法吗?

1 个答案:

答案 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 
} 
相关问题