1

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

将此 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

有任何想法吗?

4

2 回答 2

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

于 2013-07-17T14:08:52.480 回答
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);

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

于 2013-07-17T16:38:36.517 回答