我正在尝试将observableArray
中某个项目的所有内容替换为新内容。
var oldLocation = ko.utils.arrayFirst(self.locations(), function (item) {
return item.id == value.id;
});
self.locations.replace(self.locations.indexOf(oldLocation), new location(value));
self.locations.valueHasMutated();
我也试过
self.locations[self.locations.indexOf(location)] = new fizi.ko.models.location(value);
但是没有任何作用。索引被正确地检索,但是项目的更新没有发生。
3条答案
按热度按时间6l7fqoea1#
replace函数接受两个参数,一个是要替换的项,另一个是要用来替换的新项。因为你传递的是索引,而不是要替换的项,所以它不起作用。
替换调用应为:
顺便说一句,这里不需要
valueHasMutated()
调用,它将被replace()
调用调用。附带说明,许多原生Array函数可用于可观察数组。它们被转发到底层数组值,根据需要触发突变通知。这些函数包括:
(只读)的数据。
Knockout提供了这些额外的方法,这些方法应记录在here(当前版本为v3.5.1)中:
第1个月10日至第1个月11日至第1个月12日至第1个月13日至第1个月14日至第1个月15日至第1个月16日至第1个月17日至第1个月17日至第1个月
pwuypxnk2#
我只想提一下另一种办法:
Knockout在其文档中包括
splice
,但不包括replace
:但是,如果查看源代码,您会发现这两个函数都实现了(至少在KO 3.0中是这样,我不知道以前的版本中是否缺少replace
)。pvabu6sv3#
我不知道JavaScript中有数组的替换方法,也不知道Knockout中有什么。我遗漏了什么吗?
如果要使用第二种方法,则需要将位置作为可观察值进行访问:
但在使用indexOf时却不需要,因为对于可观察数组,有一个Knockout版本。