关于javascript:替换observableArray中的项目

Replacing item in observableArray

我正在尝试用新内容替换observableArray中项目的所有内容。

1
2
3
4
5
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();

我也尝试过

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

但是没有任何效果。正在正确检索索引,但没有更新项目。


replace函数接受两个参数,您要替换的项目和您要替换的新项目。您正在传递索引代替要替换的项目,因此它不起作用。

替换调用应为:

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

另一方面,您不需要在那里的valueHasMutated()调用,它会被replace()调用调用。

请注意,许多本机Array函数可用于可观察数组。根据需要将它们转发到触发突变通知的基础数组值。这些包括:

poppushreverseshiftsortspliceunshiftslice(只读)。

Knockout提供了这些附加方法,这些方法应在此处记录(当前为v3.5.1):

removeremoveAlldestroydestroyAllindexOfreplacesortedreversed


我只想提及另一种方法:

1
2
3
4
5
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
);

淘汰赛在其文档中包括splice,但不包括replace:淘汰赛可观察到的阵列文档。但是,如果您查看源代码,将会看到两个功能都已实现(至少在KO 3.0中,我不知道以前版本中是否缺少replace。)


我不知道JavaScript在数组中还是在淘汰赛中的替换方法。我想念什么吗?

如果要使用第二种方法,则需要以可观察的方式访问位置:

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

尽管在使用indexOf时不需要,但是存在可观察到的数组的Knockout版本。