У меня есть две модели: Книга принадлежит автору. Давайте рассмотрим данные автора, отправленные вместе с книжными данными, на своем пути с сервера на ExtJs и обратно. Сервер отправляет следующие вложенные данные в ExtJS:Загрузить и сохранить вложенные данные в ExtJS 4
{
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);
},
...
});
Конечно, существует модель de , но когда мне нужно загрузить данные книги и автора в одну форму сразу, я не вижу (на данный момент) другой возможности, как показано выше (конечно, скажите мне, пожалуйста, если есть что-то лучше решение).
Проблема возникает сейчас: Я выберу другого автора из комбо, и я сохраню форму. В книге записи пачкаются (author_id
появляется сейчас, как поле в Book
модели), там будет поднят запрос 'My/Books/update'
URL (это вполне нормально, I'am редактирование книга) со следующими данными, посланный на сервер:
{
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 форму таким образом, чтобы они возвращались к серверу только в той же структуре, в какой они пришли от сервера? КАК?
Этот вопрос был уже как-то обсуждали here, here и here, но ни один из этих обсуждений ответил определенно.
Заранее благодарим за помощь! :)