Knockout映射数组但不映射其子属性?

时间:2013-03-14 17:44:39

标签: knockout.js knockout-mapping-plugin

我正在尝试使用淘汰映射插件,除了一部分外,我的工作正常。

我有一个对象数组,我希望数组是可观察的,但我不希望此时数组中的对象是可观察的。

例如:

主要

  • 标签[]

标签

  • 标题
  • 编号
  • 视窗[]

窗口

  • 标题
  • 编号
  • 位置
  • var MainMapping = {
      'Tabs': {
        create: function(options) {
            return ko.mapping.fromJS(options.data, {'ignore': ['Id']}, model.tab);
        }
      }
    };
    

我希望它没有任何Window属性是可观察的,但我想要Windows数组。

有人可以给我一些如何做到的提示吗?

2 个答案:

答案 0 :(得分:0)

mapping plugin有复制选项,它创建了具有复制值的JS属性(即我认为你不能将'Window.Title'作为顶级视图模型的属性映射,尽管随意尝试!),这听起来像你所追求的。但是,因为它是一个孩子,我不确定它是否会起作用,所以你可能想看看创建映射,你可以完全控制映射,你可以直接将窗口数据对象复制到Windows数组中,或者也使用映射插件,并在其上使用复制映射。

答案 1 :(得分:0)

以下是我提出的答案:

var Main = function() {
    return { ....}
}();

var mainMap = {
    'Tabs':{
        create:function(options){
            return new Tab(options.data);
        }
    }
};

function Tab(data){
    var defaults = { ...}
    data = $.extend(true, defaults, data);

    var tabMap = {
        'copy': ['id'],
        key: function(data) {
            return ko.utils.unwrapObservable(data.id);
        },
        'windows': {
            create: function(options) {
                return new myWindow(options.data);
            }
        }
    };

    ko.mapping.fromJs(data, tabMap, this);
}

function myWindow(data){
    var defaults = { ....};
    return $.extend(true, defaults, data);
}

ko.mapping.fromJS(data, mainMap, Main);
ko.applyBindings(Main, $('#Main')[0]);