knockout:将映射扩展到复杂的JSON

时间:2013-01-25 21:08:57

标签: javascript knockout.js knockout-mapping-plugin

我从服务器收到一个复杂的JSON。让它成为下一个:

var data = [{
    name: "name1",
    items:[
        {
        name:"name11",
        subItems:[{
                name:"name111",
                children[
                    {id:1,name:"child1111",status:"good"},
                    {id:2,name:"child1112",status:"bad"},
                    {id:3,name:"child1113",status:"good"}
                ]},
                {
                name:"name112",
                children[
                    {id:4,name:"child1121",status:"good"}]
                }]
        },
        {
        name:"name12",
        subItems:[{
                name:"name121",
                children[
                    {id:5,name:"child1211",status:"bad"}]
                }]
        }]
    },
    {
    name: "name2",
    items:[
        {
        name:"name21",
        subItems:[{
                name:"name111",
                children[
                {id:7,name:"child2111",status:"good"}
                ]}]
        }]
    }];

所以我有对象列表,每个对象都包含名称和项属性。 Items是类似对象列表的属性,每个对象都包含name和subItems属性。 subItems属性与previous相同,并具有name和children属性。 children是我的实体列表。我使用mapping来填充我的ViewModel。 首先,我无法想象如何在我的实体中设置为键id。我想知道如何“潜水”它。而且,我需要扩展我的实体。添加计算属性,如下一个示例:

computProp: ko.computed(function() {return name+status;})

我不想创建js类,因为在这种情况下我没有看到映射的好处。在这种情况下,我可以实现手动映射。对我来说会更清楚。

所以任何想法,建议或评论都是受欢迎的。

PS:我搜索/阅读过类似的topics

1 个答案:

答案 0 :(得分:1)

您必须明确声明子视图模型才能获得此行为,但您仍然可以从完成所有映射中获益

http://jsfiddle.net/uXMhA/

ChildViewModel = function(data) {
    ko.mapping.fromJS(data, {}, this);
    this.computProp = ko.computed(function() {
        return this.name() + this.status();
    }, this);
};