Knockout映射插件选项

时间:2013-07-17 13:40:47

标签: knockout.js mapping observable

我不确定如何指示插件使内部数组的特定属性不可观察。

将此JSON作为我的数据:

{
    Id: 1,
    Description: "test",
    Roles: [{ Id: 1, Name: "Role 1" }, { Id: 2, Name: "Role 2" }]
}

Roles数组应该是可观察的,但我不想让任何项目的“Id”字段可观察,我正在尝试不同的方法,但没有运气:

ko.mapping.fromJS(data, { 'copy': [ "Roles.Id" ] });
ko.mapping.fromJS(data, { 'copy': [ "Roles[].Id" ] });
ko.mapping.fromJS(data, { 'copy': [ "Roles[0].Id" ] }); // this only works with the first item

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我不知道是否有针对您的问题的直接解决方案,我尝试导航到Roles数组的后代但没有工作(如您的尝试)但您可以通过定义来制作简单的技巧Roles项目对象的模型:

function RolesModel(id, name) {
    this.Id = id;
    this.Name = ko.observable(name);
}

然后使用映射配置来控制Roles对象的创建,如下所示:

var mapping = {
    'Roles': {
        create: function (options) {
            return new RolesModel(options.data.Id, options.data.Name)
        }
    }
}

正如我告诉过你的我不知道直接解决方案,但这会奏效。请检查我的 DEMO

答案 1 :(得分:1)

好吧,也许我找到了解决方案,从@ebram tharwat建议开始。

我将映射选项拆分为两个:

var mappingRole = { 'copy': ["Id"] };

var mapping = {
    'Roles': {
        create: function (opts) {
            return ko.mapping.fromJS(opts.data, mappingRole);
        }
    }
};

然后我原来的映射可能是这样的:

ko.mapping.fromJS(data, mapping);

并且似乎工作正常,不确定性能,但对我来说更重要的是不必手动定义后代视图模型。