【问题标题】:Updating observable array in knockout在淘汰赛中更新可观察数组
【发布时间】:2013-05-01 18:40:06
【问题描述】:

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

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

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

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

【问题讨论】:

  • “adminToAdd”是可观察对象还是简单对象?
  • 具有可观察属性的对象。

标签: javascript knockout.js knockout-2.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 
} 

【讨论】:

  • @rross 不确定administrators 中的对象本身是否是可观察对象,但如果是这种情况,我可以更新示例。
猜你喜欢
  • 2015-01-25
  • 2012-09-08
  • 2015-10-05
  • 2021-09-19
  • 2018-03-30
  • 2015-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多