2013-03-15 70 views
31

我试图用新内容替换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); 

但没有什么工作。该索引正在被正确检索,但该项目的更新没有发生。

+0

你是什么意思的“但没有工作。”?你没有数组中的新项目?或者你没有看到用户界面中的替换?请发布您的HTML和绑定以及位置对象的外观如何! – nemesv 2013-03-15 19:47:43

+0

两者。模型没有更新,因为模型没有更新,所以也没有更新。 – bflemi3 2013-03-15 19:55:25

回答

45

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

替换调用应该是:

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

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

+9

我得问,在哪里上earth是在可观察数组中提到replace方法的文档?我看了看,看不到它在文档中的任何地方! – 2013-03-15 19:59:40

+4

@PaulManzotti - http://www.knockmeout.net/2011/06/10-things-to-know-about-knockoutjs-on.html中的第7项提到了添加的方法。 – DaveB 2013-03-15 20:55:27

+1

谢谢,我会保留该页面的书签! :) – 2013-03-15 21:09:21

1

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

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

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

尽管你不使用的indexOf时,因为是对于观察到的阵列淘汰赛版本。

+1

我还没有看到它记录任何地方,但它的源代码:https://github.com/knockout/knockout/blob/master/src/subscribables/observableArray.js – 2013-09-11 14:26:22

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 
); 

淘汰赛包括在其文档中splice,但不包括replaceKnockout Obervable Arrays Docs。但是,如果您查看源代码,则会看到两个函数都已实现(至少在KO 3.0中,我不知道以前版本中是否缺少replace)。