2012-07-07 77 views
1

小提琴here淘汰赛映射问题与阵列

我有,我想直接映射到我的视图模型的集合对象的数组,但我想自定义的映射。代码不起作用,除非data.UserReports集合中只有一个项目。

我可以做到这一点,如果我在对象图中添加另一层 - 例如,而不是映射data.UserReports到model.UserReports - 如果我有一个名为Foo的模型属性 - 我可以将数据映射到foo和然后通过model.Foo.UserReports访问该集合,但这是不可取的和混乱的。

我也认为我可以做到这一点,如果我遍历data.UserReports数组,并将每个UserReport推入模型的集合 - 但这又似乎笨拙。

那么小提琴有什么问题?

回答

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); 
}​);​ 

http://jsfiddle.net/Quu4f/27/


更新:您还需要/应具体规定键数据对象的映射选项应该被应用:

var userReportMapping = { 
    'UserReports': { 
     key: function(data) { 
      return ko.utils.unwrapObservable(data.Id); 
     }, 
     create: function(options) { 
      return new userReportModel(options.data); 
     } 
    } 
}; 

然而,当你得到一个错误时有点奇怪您在数据集中有两个具有相同ID的项目。看起来好像“创建”回调没有针对重复执行,但仍然创建了一个普通的观察值。

http://jsfiddle.net/Quu4f/29/

+0

使得与映射没有区别如图所示 - 它不工作的要求 - 看到我的“答案”上面的工作代码,能够完成任务,而不是(IMO)的理想 – BonyT 2012-07-07 21:44:29

+0

对不起 - 需要更清楚 - 当然你已经发布的代码有效 - 我正在努力解决的问题是如何定制映射来处理数组。 – BonyT 2012-07-07 21:45:17

+0

@BonyT好吧,没有马上得到。找到了另一点并更新了我的答案 - 但我仍然不确定这是您现在要找的。 – Niko 2012-07-07 22:01:24

0

This通过迭代遍历数组并将每个项目依次推送到可观察集合 - 是否有更好的方法?