我有一个简单的模型,让我们说:
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'
}
}
});
答案 0 :(得分:2)
查看演示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
的read
或getResponseData
方法