我正在尝试用新内容替换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);
但没有任何效果。正在检索索引,但项目的更新没有发生。
答案 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
,但未包含replace
:Knockout 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版本。