在observableArray更换项目(Replacing item in observableA

2019-08-17 16:07发布

我试图取代所有的项目的内容在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);

但是,没有什么工作。 该指数被正确地获取,但该项目的更新没有发生。

Answer 1:

替换函数接受两个参数,要更换的项目,你要替换它的新项目。 你逝去的索引到位的项目来替代,因此无法正常工作。

替换调用应该是:

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

在一个侧面说明,你不应该需要valueHasMutated()调用在那里,这将是由被调用replace()调用。



Answer 2:

我只是想提一提的另一种方式做到这一点:

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 : 淘汰赛Obervable阵列文档 。 但是,如果你看看源代码,你会看到两个功能被实现(至少在KO 3.0,我不知道是否replace以前的版本失踪)。



Answer 3:

我不知道在JavaScript中替代方法阵列,或在淘汰赛。 我缺少的东西吗?

如果你想使用你的第二个方法,那么您需要访问的地点作为可观察到的:

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

虽然你使用的indexOf时,因为是对于观察到的阵列淘汰赛版别。



文章来源: Replacing item in observableArray