javascript - 在 Sencha Touch 中自动加载多层嵌套 JSON

标签 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 的自动加载功能,还是需要自己编写代码来创建子存储并用子模型填充它?

我在这里创建了一个 fiddle https://fiddle.sencha.com/#fiddle/7n6以防万一有人有时间弄乱示例。

最佳答案

使用Ext.data.TreeStore而不是Ext.data.Store

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

关于javascript - 在 Sencha Touch 中自动加载多层嵌套 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24763415/

相关文章:

javascript - 内联 Javascript Mp3 播放器帮助

javascript - 通过 MediaWiki API 从文章返回文本?

javascript - Sencha 触摸2 : How can I add Google+ Login?

php - Javascript 函数未定义

javascript - 在表格上打印时图像消失

c++ - 如何使用 Qt 处理 json 中编码的西里尔字母数据?

java - 从多个 QuerySpec AWS Dynamodb 创建大型 JSON 响应

javascript - 使用 JSBuilder 或 Apache ANT 构建 Sencha Touch 应用程序

javascript - 扩展 Sencha Touch 对象

php - 一页上的多个 HTML 表单