小提琴here
我有一个对象数组,我想直接映射到我的viewmodel上的一个集合,但我想自定义映射。除非data.UserReports集合中只有一个项目,否则代码不起作用。
如果我在对象图中添加另一个图层,我可以这样做 - 例如,而不是将data.UserReports映射到model.UserReports - 如果我在模型上有一个名为Foo的属性 - 我可以将数据映射到foo然后通过model.Foo.UserReports访问该集合,但这是不可取的和杂乱的。
我还认为,如果我遍历data.UserReports数组,并依次将每个UserReport推送到模型的集合上,我就能做到这一点 - 但这又看起来很笨拙。
小提琴怎么了?
答案 0 :(得分:1)
那个小提琴中的代码根本不起作用,至少不适合我。但是,这里通常是如何将映射插件与现有的视图模型实例一起使用:
function PageModel() { /* ... */ }
$(document).ready(function() {
var model = new PageModel();
// Don't replace some observable, but extend the view model automatically,
// creating an observable for each property in "data".
ko.mapping.fromJS(data, userReportMapping, model);
ko.applyBindings(model);
});
更新:您还需要/应指定数据对象中的哪个键应该应用映射选项:
var userReportMapping = {
'UserReports': {
key: function(data) {
return ko.utils.unwrapObservable(data.Id);
},
create: function(options) {
return new userReportModel(options.data);
}
}
};
但是,如果数据集中有两个具有相同ID的项目,则会出现错误,这有点奇怪。看起来好像没有为副本执行“create”回调,但仍然会创建一个普通的observable。
答案 1 :(得分:0)
This通过遍历数组并依次将每个项目推送到可观察集合来实现它 - 有更好的方法吗?