我试图通过我的商店代理将嵌套的JSON对象发送到我的服务器。我使用的是ExtJS 5.1,在下面的代码中,我使用了hasMany
属性来指定嵌套的JSON模型。
Ext.define('MyApp.model.PersonStore',{
extend: 'Ext.data.Store',
model: 'MyApp.model.Person',
storeId: 'PersonStore',
proxy: {
type: 'ajax',
url: 'http://localhost:80/index.php?person=create',
reader: {
type: 'json'
},
writer: {
type: 'json'
}
}
});
Ext.define('MyApp.model.Person',{
extend: 'Ext.data.Model',
idProperty: 'id',
fields: [
{name: 'id', type: 'int'},
{name: 'name', type: 'string'},
{name: 'age', type: 'int'},
],
hasMany: {
model: 'MyApp.model.Item',
name: 'items',
associationKey: 'items'
}
});
Ext.define('MyApp.model.Item',{
extend: 'Ext.data.Model',
fields: [
{
name: 'id',
type: 'int'
},
{
name: 'itemType',
type: 'string'
}
],
belongsTo: 'MyApp.model.Person'
});
然后在我的控制器中创建一个新人时,我这样做:
var store = grid.getStore();
store.add({name: 'Steve', age: '50'});
var lastInsertedPerson = store.last();
var items = lastInsertedPerson.items();
items.add({itemType: 'item1'});
items.add({itemType: 'item2'});
store.sync();
然后POST请求以这种格式发送:
{"id":"MyApp.model.Person-1", "name":"Steve", "age":"50"}
但我希望它是:
{"id":"MyApp.model.Person-1", "name":"Steve", "age":"50", "items":[{"itemType":"item1"}, {"itemType":"item2"}]}
那么为什么POST请求中的json对象不包含嵌套的Item
对象?
答案 0 :(得分:0)
为了使嵌套数据出现在post对象中,您必须在父模型的代理编写器对象中设置配置。因此,如果您将Person
模型更改为类似下面的代码,则嵌套对象应该通过:
Ext.define('MyApp.model.Person',{
extend: 'Ext.data.Model',
idProperty: 'id',
fields: [
{name: 'id', type: 'int'},
{name: 'name', type: 'string'},
{name: 'age', type: 'int'},
],
hasMany: {
model: 'MyApp.model.Item',
name: 'items',
associationKey: 'items'
},
proxy: {
url: '/url/to/your/backend/service',
writer: {
type: 'json',
allDataOptions: {
associated: true
}
}
}
});
请注意,编写器也有partialDataOptions
配置,因此如果您希望嵌套数据在PUT中通过,则还必须在那里设置associated
配置。有关编写器配置选项的更多详细信息,请参阅Ext Docs。