mik*_*elb 6 javascript knockout-mapping-plugin knockout.js
我一直试图解决这个问题很长一段时间了.我找不到任何解决这个问题的方法,但如果我错了请纠正我.
问题:我有来自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);?
Run Code Online (Sandbox Code Playgroud)
小提琴:http://jsfiddle.net/mikaelbr/gDjA7/
如您所见,第一行插入数据.都好.但是当我尝试更新时,它会替换内容.第三个映射相同; 它取代了内容,而不是扩展它.
我用错了吗?我应该在使用映射之前尝试"手动"扩展内容吗?
编辑解决方案:
我通过使用存储所有当前模型的第二个辅助数组解决了这种情况.在新数据上,我扩展了这个数组,并更新了视图模型以包含累积的项目.
在更新(在我的情况下,WebSocket的消息),我通过模型环,有关更改的项目内容,以及使用的方法valueHasMutated()得到改变的值淘汰赛LIB的通知.
从查看您的示例代码来看,映射插件的行为完全符合我的预期。当您调用fromJS一个集合时,您实际上是在告诉映射插件这是该集合的新内容。例如:
在第二行,它如何知道您是否正在更新或是否只是删除了 id:2?
我找不到任何提及将数据视为简单更新的合适方法,尽管您可以添加一个。映射数组附带了一些有用的方法,例如mappedIndexOf帮助您查找特定项目。如果您收到更新数据集,只需循环遍历它,找到该项目并通过对该特定项目的mapping.fromJS 调用来更新它。这可以很容易地推广到可重用的方法。
| 归档时间: |
|
| 查看次数: |
3548 次 |
| 最近记录: |