1

在这里提琴

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

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

我还认为,如果我遍历 data.UserReports 数组,然后将每个 UserReport 依次推送到模型的集合中,我可以做到这一点——但这又显得笨拙。

那么小提琴有什么问题呢?

4

2 回答 2

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/

于 2012-07-07T21:41:20.863 回答
0

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

于 2012-07-07T21:30:03.440 回答