ExtJS 6 Rest Proxy,其中JSON数据对象是ID

时间:2017-02-19 06:42:30

标签: json rest api extjs extjs6

我希望有人可以指导我如何处理这个json数据结构。

以下是一个例子:(我无法控制这些数据)

{
    "1": {
        "name": "thing 01",
        "attributes": {
            "color": "red",
            "brand": "ACME"
        } 
    },
    "2": {
        "name": "thing 02",
        "attributes": {
            "color": "blue",
            "brand": "ACME"
        }
    }
}

所以我对如何使用reader

获取记录感到困惑
Ext.define('MyApp.model.Thing', {
    extend: 'Ext.data.Model'

    fields: [
        { name: 'name' },
        { name: 'attributes', type: 'auto' }
    ],

    proxy: {
        type: 'rest',
        url: 'http://example.com/api/things',

        reader: {
            type: 'json',
            rootProperty: ??? // <--- How should this work?
        }
    }
});

我想知道是否有办法做某事......

rootProperty: '[id]'

还有一种方法可以在数据对象时指定ID吗?也许以某种方式在模型上使用idProperty配置?

我应该使用reader.format方法吗?这看起来有点粗......

任何想法都是贬义的。谢谢!

2 个答案:

答案 0 :(得分:5)

编写自定义阅读器类:

Ext.define('MyReader', {
    extend: 'Ext.data.reader.Json',
    alias: 'reader.myreader',

    config: {
        transform: function (data) {
            var ret = [],
                key, o;

            for (key in data) {
                o = data[key];
                o.id = key;
                ret.push(o);
            }

            return ret;
        }
    }
});

Ext.define('Thing', {
    extend: 'Ext.data.Model',

    fields: ['name', 'attribute'],

    proxy: {
        type: 'ajax',
        url: 'data1.json',

        reader: {
            type: 'myreader'
        }
    }
});

示例fiddle

答案 1 :(得分:2)

您的确切问题已经回答here

您应该实现自定义阅读器并覆盖getResponseData方法。

Ext.define('MyReader', {
    extend: 'Ext.data.reader.Json',
    alias: 'reader.myreader',

    getResponseData: function(response) {
        var data = this.callParent([response]);

        //do stuff here

        return data;
    }
});