knockout.js 正在替换observableArray中的项

wnvonmuf  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(166)

我正在尝试将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);

但是没有任何作用。索引被正确地检索,但是项目的更新没有发生。

6l7fqoea

6l7fqoea1#

replace函数接受两个参数,一个是要替换的项,另一个是要用来替换的新项。因为你传递的是索引,而不是要替换的项,所以它不起作用。
替换调用应为:

self.locations.replace(oldLocation, new location(value));

顺便说一句,这里不需要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个月

pwuypxnk

pwuypxnk2#

我只想提一下另一种办法:

self.locations.splice(
  self.locations.indexOf(location),   // Index of the 1st element to remove
  1,                                  // Number of elements to remote at this index
  new fizi.ko.models.location(value)  // A param for each element to add at the index
);

Knockout在其文档中包括splice,但不包括replace:但是,如果查看源代码,您会发现这两个函数都实现了(至少在KO 3.0中是这样,我不知道以前的版本中是否缺少replace)。

pvabu6sv

pvabu6sv3#

我不知道JavaScript中有数组的替换方法,也不知道Knockout中有什么。我遗漏了什么吗?
如果要使用第二种方法,则需要将位置作为可观察值进行访问:

self.locations()[self.locations.indexOf(location)] = new fizi.ko.models.location(value);
self.locations.valueHasMutated();

但在使用indexOf时却不需要,因为对于可观察数组,有一个Knockout版本。

相关问题