2013-03-25 4 views
3

У меня есть две модели: Книга принадлежит автору. Давайте рассмотрим данные автора, отправленные вместе с книжными данными, на своем пути с сервера на 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, но ни один из этих обсуждений ответил определенно.

Заранее благодарим за помощь! :)

ответ

1

Короткий ответ: Нет, еще нет.

Более длинный ответ: вы можете создать свой собственный сценарий для обработки своей структуры данных и отправить его обратно на сервер так же, как вы его получили.

Вы можете либо создать свой собственный писатель, наследуя: http://docs.sencha.com/ext-js/4-2/#!/api/Ext.data.writer.Writer и использовать его в прокси-сервере

или

Вы можете создать функцию на модели, которая изменяет его структуру. Поскольку вы не используете магазины, вы можете создать функцию saveModel(), в которой вы измените структуру модели и вызовите метод save().

Смежные вопросы