在Sencha Touch中自动加载多级嵌套JSON

时间:2014-07-15 16:26:09

标签: javascript json sencha-touch sencha-touch-2

我在加载包含多个嵌套级别的JSON时遇到问题。我有一个模型(位置),它有一组与每个模型相关联的模型(项目)。

项目模型

Ext.define('SenchaSandbox.model.Item', {
    extend: 'Ext.data.Model',

    requires: ['Ext.data.Field'],

    config: {
        fields: ['id', 'name']
    }
});

位置模型

Ext.define('SenchaSandbox.model.Location', {
    extend: 'Ext.data.Model',

    requires: ['Ext.data.Field', 'Ext.data.association.HasMany'],

    uses: ['SenchaSandbox.model.Item'],

    config: {
        fields: ['id', 'name'],
        associations: [{
            type: 'hasMany',
            model: 'SenchaSandbox.model.Item',
            autoLoad: true,
            name: 'items'
        }]
    }
});

位置商店

Ext.define('SenchaSandbox.store.LocationStore', {
    extend: 'Ext.data.Store',

    requires: [
        'Location',
        'Ext.data.proxy.Ajax',
        'Ext.data.reader.Json'
    ],

    config: {
        model: 'SenchaSandbox.model.Location',
        storeId: 'LocationStore',
        proxy: {
            type: 'ajax',
            url: 'DummyGood.json',
            reader: {
                type: 'json',
                rootProperty: 'location'
            }
        }
    }
});

在理想的世界中,如果来自服务器的JSON如下所示,Sencha会自动加载位置及其关联的项目。

好JSON

{"location": [
    {
        "id": 100,
        "name": "Location 1",
        "items": [
            {
                "id": 1,
                "name": "Item A"
            },
            {
                "id": 2,
                "name": "Item B"
            }
        ]
    },
    {
        "id": 200,
        "name": "Location 2",
        "items": [
            {
                "id": 3,
                "name": "Item A"
            },
            {
                "id": 4,
                "name": "Item C"
            }
        ]
    }
]}

但是,服务器实际上返回JSON,其中包含一些类似于下面的嵌套。

错误(服务器)JSON

{"CollectionLocation": {
    "collection": [
        {
            "id": 100,
            "name": "Location 1",
            "items": {
                "collection": [
                    {
                        "id": 1,
                        "name": "Item A"
                    },
                    {
                        "id": 2,
                        "name": "Item B"
                    }
                ]
            }
        },
        {
            "id": 200,
            "name": "Location 2",
            "items": {
                "collection": [
                    {
                        "id": 3,
                        "name": "Item A"
                    },
                    {
                        "id": 4,
                        "name": "Item C"
                    }
                ]
            }
        }
    ]
 }}

假设我无法控制生成此JSON的服务器代码,那么以干净的方式加载此数据有哪些选择?我是否仍然可以利用Sencha的自动加载功能,或者我是否需要自己编写代码来创建子存储并用子模型填充它?

我已经在这里创建了一个小提琴https://fiddle.sencha.com/#fiddle/7n6,以防有人花一分钟时间来处理样本。

1 个答案:

答案 0 :(得分:1)

使用Ext.data.TreeStore代替Ext.data.Store

http://docs-origin.sencha.com/touch/2.3.1/#!/api/Ext.data.TreeStore