2012-06-07 76 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)已更新。後貼圖幫助我們在映射集合中找到相應的元素。希望它能幫助你。 –