【问题标题】:Knockout mapping issue with arrays数组的敲除映射问题
【发布时间】:2012-07-07 21:09:20
【问题描述】:

小提琴here

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

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

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

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

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案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/

    【讨论】:

    • 与所示映射没有区别 - 它不能按要求工作 - 请参阅我上面的“答案”以获取完成工作但不是(imo)理想的工作代码
    • 抱歉 - 需要更清楚 - 当然您发布的代码有效 - 我正在努力解决的问题是如何自定义映射以处理数组。
    • @BonyT 好的,没马上明白。又找到了一点并更新了我的答案 - 但我仍然不太确定这是否是您现在正在寻找的。​​span>
    • 啊 - 这两个项目应该有不同的键。但是谢谢 - 是的,这是缺失的部分 - 你将映射代码交给包含数组的对象 - 并设置映射代码来处理外部对象。完美 - 谢谢。
    【解决方案2】:

    This 是通过遍历数组并将每个项目依次推送到可观察集合中来做到这一点 - 有没有更好的方法?

    【讨论】:

      猜你喜欢
      • 2013-07-17
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多