替换observableArray中的项目

时间:2013-03-15 19:39:38

标签: javascript knockout.js ko.observablearray

我正在尝试用新内容替换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 个答案:

答案 0 :(得分:48)

替换功能接受两个参数,即要替换的项目和要替换它的新项目。您正在传入索引来代替要替换的项目,因此它不起作用。

替换呼叫应该是:

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

在旁注中,您不应该在那里进行valueHasMutated()调用,它会被replace()调用调用。

答案 1 :(得分:4)

我只想提一种替代方法:

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,但未包含replaceKnockout Obervable Arrays Docs。但是,如果你查看源代码,你会发现两个函数都已实现(至少在KO 3.0中,我不知道以前的版本中是否缺少replace)。

答案 2 :(得分:3)

我不知道JavaScript中的数组或Knockout中的替换方法。我错过了什么吗?

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

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

虽然在使用indexOf时没有,因为对于可观察数组有一个Knockout版本。