对属性名称为动态的数组中的对象进行Knockout映射

时间:2015-09-17 16:35:44

标签: javascript knockout.js

我有一个返回以下表单数据的服务(我可以为此添加字段,但我无法更改层次结构):

{
    Sections: {
        3a: [
            {   
                /* Item definition */
                ID: 1,
                Text: "Completed Form INNSAMEM002",
                ...
            },
            ...
        ],
        3b: [
            ...
        ],
        ...
    }
}

我想使用映射插件为每个项目定义调用自定义构造函数,但是遇到了麻烦,因为它被分成了几个部分;所以,映射可以这样工作:

var _mapping = {
    '3a': {
        create: function(o) { return new ItemModel(o.data); }
    }
});

但是,部分名称无法提前知道。

我可以浏览AJAX数据,查找所有部分,并在运行之前生成映射配置,但只是想知道是否有更好的方法?

解决方案:CrimsonChris的答案给了我这样做的方法;最终的映射是:

var _mapping =  {
    'Sections': {
        create: 
            function(o) 
            { 
                var res = {};

                $.each(o.data,
                    function(sectionkey, section)
                    {
                        var secres = [];

                        $.each(section,
                            function(itemindex, item) 
                            {
                                secres.push(new ItemModel(item));
                            }
                        );

                        res[sectionkey] = secres;
                    }
                );

                return res;
            }
    }
};

1 个答案:

答案 0 :(得分:0)

您可以在响应中循环遍历Sections的属性以获取每个部分。然后将每个部分的项目映射到ItemModel

var _mapping = {
    'Sections': {
        create: function (options) {
            var sections = [];
            for (var sectionName in options.data) {
                sections.push(new SectionModel(options.data[sectionName], sectionName);
            }
            return sections;
        }
    }
}

function SectionModel(items, sectionName) {
    this.items = items.map((item) => new ItemModel(item));
    this.sectionName = sectionName;
}