数组的Knockout映射问题

时间:2012-07-07 21:09:20

标签: knockout.js knockout-mapping-plugin

小提琴here

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

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

我还认为,如果我遍历data.UserReports数组,并依次将每个UserReport推送到模型的集合上,我就能做到这一点 - 但这又看起来很笨拙。

小提琴怎么了?

2 个答案:

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

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的项目,则会出现错误,这有点奇怪。看起来好像没有为副本执行“create”回调,但仍然会创建一个普通的observable。

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

答案 1 :(得分:0)

This通过遍历数组并依次将每个项目推送到可观察集合来实现它 - 有更好的方法吗?