0

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

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

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

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

4

1 回答 1

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 
} 
于 2013-05-07T17:59:58.967 回答