我有两个模型:书籍属于作者。让我们调查作者数据与书籍数据一起发送,从服务器到ExtJs再返回。服务器将以下嵌套数据发送到ExtJs:
{
success : true,
data: {
id: '23',
name: 'JavaScript - The definitive guide'
author: { // <<-- nested author data
id: '45',
name: 'David Flanagan',
}
}
}
在ExtJs一侧,数据由以下模型处理:
Ext.define('My.models.Book', {
extend: 'Ext.data.Model',
idProperty: 'id',
fields: [
'id',,
'name',
{name: 'author_id', mapping: 'Author.id'}, // <<-- flat author data
],
proxy: {
type: 'ajax',
api: {
read: 'My/Books/index',
create: 'My/Books/create',
update: 'My/Books/update',
destroy: 'My/Books/delete'
},
reader: {
type: 'json',
root: 'data',
},
writer: {
type: 'json',
root: 'data',
},
},
associatinons: [{
type: 'belongsTo',
model: 'My.models.Author',
associationKey: 'Author',
}]
});
由于在Author.id
模型(author_id
)的Book
字段上映射{name: 'author_id', mapping: 'Author.id'}
,我可以将作者的数据加载到以下用于编辑图书数据的表单中:
Ext.define('My.views.books.Form', {
extend: 'Ext.form.Panel',
initComponent: function () {
var me = this;
me.items = [{
xtype: 'container',
layout:'anchor',
defaults:{
anchor: '95%'
},
items:[{
xtype: 'textfield',
fieldLabel: 'Book title',
name: 'name'
},{
xtype: 'combo',
fieldLabel: 'Author',
name: 'author_id', // <<-- flat author data
store: ...
}]
}];
me.buttons = [{
text: 'Save',
scope: me,
handler: me.onSave
}];
me.callParent(arguments);
},
...
});
当然有专门为作者设计的模型,但当我需要同时将书籍和作者数据加载到一个表格中时,我看不到(目前)其他可能性如上所示(当然让我看看)请它,如果有更好的解决方案)。
现在出现问题:我会从组合中选择其他作者,我会保存表单。随着图书记录变脏(author_id
现在显示为Book
模型字段),会向'My/Books/update'
网址发出请求(这很好,我正在编辑图书)将以下数据发送到服务器:
{
data: {
id: '23',
name: 'JavaScript - The definitive guide',
author_id: '78' // <<-- flat author data
}
}
返回服务器的数据与发送到ExtJs的结构不同,必须进行某种翻译,如:
$data['Author']['id'] = @$data['author_id'];
unset($data['author_id']);
我在问:是否可以通过ExtJs形式处理数据,以便它们能够以与服务器相同的结构返回到服务器? HOW吗
这个问题已经以某种方式进行了讨论here,here和here,但这些讨论都没有明确回答。
提前感谢您的帮助! :)
答案 0 :(得分:1)
简答:不,还没有。
更长的答案:您可以创建自己的编写器来处理数据结构,并以与收到数据结构相同的方式将其发送回服务器。
您可以通过子类化创建自己的编写器:http://docs.sencha.com/ext-js/4-2/#!/api/Ext.data.writer.Writer并在代理中使用它
或
您可以在模型上创建一个更改其结构的函数。 由于您没有使用商店,您可以创建一个函数saveModel(),您可以在其中更改模型结构并调用save()方法。