2012-06-07 41 views
1

我需要Knockout JS的帮助。Knockout JS:如何更新整个可观察阵列

我有一个待办事项列表类型的Web应用程序,我需要根据需要更新包含从数据库中获取的数据的任务列表的整个可观察数组。

我已经在这里创造一个样品小提琴:http://jsfiddle.net/ingro/43XcU/26/

self.update = function(){ 

    var values = [ 
     {time: "17:00", title: "test#11"}, 
     {time: "18:00", title: "work#22"},  
     {time: "19:00", title: "task#33"},  
     {time: "20:00", title: "sleep#14"} 
    ]; 

    self.clone = ko.observableArray(ko.utils.arrayMap(values , function(clone) { 
     return new Post(clone.time, clone.title); 
    })); 

    var count = 0; 

    ko.utils.arrayForEach(self.posts(), function(post) { 
     post.time(self.clone()[count].time()); 
     post.title(self.clone()[count].title()); 
     count++; 
    });   

} 

数据在“值”模拟从服务器的JSON响应。我做它的唯一方法是创建一个克隆可观察数组,然后遍历真实数组,然后用新值逐个更新其所有元素。由于多种原因,这不是一个最佳解决方案,例如,如果两个阵列中的元素数量不相等等等。

所以任何人都可以建议我一个更好的方式来更新它?

感谢和我的可怕的英语不好意思:d

回答

2

我不知道它是绝对你需要什么,但我通过淘汰赛映射插件做到了: http://knockoutjs.com/documentation/plugins-mapping.html

你可以在这里尝试小提琴:http://jsfiddle.net/Chubyone/a682w/6/

问候。

+0

它的工作就像一个魅力!很感谢! :D – Ingro

+0

不好意思,我刚刚被封锁了...如果我只想更新一个元素,让我们说第二个元素呢? – Ingro

+0

我更新了小提琴找到一种方法:http://jsfiddle.net/Chubyone/a682w/9/。我删除了一些像Post构造函数的东西,并让映射插件完成全部工作。创建一个新的方法来考虑你想保存所有,或只更新一个。所以你可以运行:单击更新:更新2#。重新运行,单击保存:数组已更改;然后单击更新:第一个(08:00)已更新。后贴图帮助我们在映射集合中找到相应的元素。希望它能帮助你。 –