Extjs简单模型和商店

时间:2015-01-22 11:15:46

标签: json extjs model associations store

我有一个简单的模型,让我们说:

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

    fields: [
        {name: 'firstname',    type: 'string'},
        {name: 'lastname',     type: 'string'}
    ]
});

一个看起来像这样的json文件:

{  
"DatabaseInJSON": {
    "Users": [
      {
        "KeyFirstName": "John",
        "KeyLastName": "Doe"
      },{
        "KeyFirstName": "James",
        "KeyLastName": "Howlett"
      }
    ],
    "OtherStuffWeDontCareAbout": [
        ...
    ]
  }
}

我的问题是: 如果我创建这样的商店,我如何将我的模型中的属性“firstname”映射到我的json中的“KeyFirstName”?

Ext.define('my.custom.Store', {
    extend: 'Ext.data.Store',

    model: 'UserModel',

    proxy: {
        type: 'ajax',
        url: 'path/to/my/file.json',
        reader: {
            type: 'json',
            rootProperty: 'DatabaseInJSON'
        }
    }
});

2 个答案:

答案 0 :(得分:2)

您需要使用mappingconvert功能

查看演示here的演示文稿。

为了演示,我将您的商店变成了memory代理商店,我认为您也应该访问rootProperty错误,因为它应该是rootProperty: 'DatabaseInJSON.Users'

代码:

Ext.application({
    name: 'Fiddle',

    launch: function() {

        myData = {
            "DatabaseInJSON": {
                "Users": [{
                    "KeyFirstName": "John",
                    "KeyLastName": "Doe"
                }, {
                    "KeyFirstName": "James",
                    "KeyLastName": "Howlett"
                }],
                "OtherStuffWeDontCareAbout": {}
            }
        };


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

            fields: [{
                name: 'firstname',
                mapping: 'KeyFirstName',
                type: 'string'
            }, {
                name: 'lastname',
                convert: function(v, record) {
                    return record.data.KeyLastName;
                },
                type: 'string'
            }]
        });

        Ext.define('my.custom.Store', {
            extend: 'Ext.data.Store',

            model: 'UserModel',

            proxy: {
                type: 'memory',
                reader: {
                    type: 'json',
                    rootProperty: 'DatabaseInJSON.Users'
                }
            }
        });

        myStore = Ext.create('my.custom.Store', {
            data: myData
        });
        console.log(myStore.getRange());
    }
});

答案 1 :(得分:1)

通常,您的Json属性应与您的字段的相同名称匹配,以便读者可以正确阅读它们,以映射' KeyFirstName'到'名字'我认为您最好的选择是在模型的字段定义中创建mapping

这将全局应用于所有请求,我相信它会在保存数据时反转映射。

要在您的案例中使用映射,您需要以下内容:

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

    fields: [
        {name: 'firstname', type: 'string', mapping: function(data) { return data.KeyFirstName; } },
        {name: 'lastname', type: 'string', mapping: function(data) { return data.KeyLastName; } }
    ]
});

除了更改JSON数据的格式之外,我能想到的另一种方法是覆盖JsonReader

readgetResponseData方法