我一直試圖弄清楚現在已經有相當長的一段時間了。我找不到解決這個問題的任何問題,但如果我錯了,請糾正我。KnockoutJS:使用映射將數據更新/插入到視圖模型
問題: 我有一個來自JSON API的數據,嵌套的數組/對象結構。我使用映射來最初用我的數據填充模型。爲了更新這個,我想在新數據到達時擴展模型,或更新現有數據。
據我發現,映射選項鍵,應該爲我做這個技巧,但我可能誤解了映射選項的功能。
我歸結問題通過這個例子來表示:
var userMapping = {
key: function(item) {
return ko.utils.unwrapObservable(item.id);
}
};
// JSON call replaced with values
var viewModel = {
users: ko.mapping.fromJS([], userMapping)
};
// Should insert new - new ID?
ko.mapping.fromJS([{"id":1,"name":"Foo"}, {"id":2,"name":"Bar"}], userMapping, viewModel.users);
// Should only update ID#1 - same ID?
ko.mapping.fromJS([{"id":1,"name":"Bat"}], userMapping, viewModel.users);
// Should insert new - New ID?
ko.mapping.fromJS([{"id":3,"name":"New"}, {"id":4,"name":"New"}], userMapping, viewModel.users);
ko.applyBindings(viewModel);
小提琴:http://jsfiddle.net/mikaelbr/gDjA7/
正如你可以看到,第一行插入數據。都好。但是當我嘗試更新時,它會替換內容。對於第三種映射也是如此;它取代了內容,而不是擴展它。
我用錯了嗎?我應該嘗試在使用映射之前「手動」擴展內容嗎?
編輯解決方案:
我由具有第二輔助陣列中存儲的所有當前模型解決了這個情況。在新數據上我擴展了這個數組,並更新了視圖模型以包含累積項目。
在更新(在我的情況下是一個WebSocket消息),我循環遍歷模型,更改了有問題的項目的內容,並使用方法valueHasMutated()將更改值通知給Knockout庫。
是的。這或多或少是我解決它的方法。 – mikaelb 2012-03-09 17:18:12
對此的任何想法:http://stackoverflow.com/questions/20397054/knockout-js-mapping-keys-and-kendo-ui-grid – jtromans 2013-12-05 10:26:30