Как записать данные нескольких гридов EXTJS в один запрос? - PullRequest
2 голосов
/ 01 сентября 2011

Например, у меня есть 2 модели:

Ext.define('Order', {
    extend   : 'Ext.data.Model',
    fields   : [
            {name : 'id',          type : 'int'},
            {name : 'customer_id', type : 'int'},
            {name : 'date',        type : 'date'}
    ],
    hasMany: [{model: 'Product', name: 'Products'}]
});

Ext.define('Product', {
    extend   : 'Ext.data.Model',
    fields   : [
            {name : 'id',          type : 'int'},
            {name : 'name',        type : 'string'},
            {name : 'description', type : 'string'},
            {name : 'price',       type : 'float'}
    ],
    belongsTo: 'Order'
});

, эти модели отображаются в 2 сетках.Затем, когда изменения сделаны, мне нужно опубликовать их на сервере.Но хитрость в том, что мне нужно опубликовать обе модели в одном запросе, например:

{"order":{"id":1, "date":'2011.09.01', "Products": [{"id":1, "name":"product name", ... }]}}

Таким образом, я думаю, что обе сетки должны использовать одно хранилище, а перед записью хранилище должно быть заполнено изменениями сетки (возможно, некоторые внутренниемагазины без возможности записи на сервер).

Как это реализовать?Есть идеи?

Ответы [ 2 ]

2 голосов
/ 15 февраля 2012

Решением является сохранение данных в памяти и сохранение сохраненного заполняемого хранилища вручную и вызов метода сохранения:

Ext.define('OrderStore', {
    extend: 'Ext.data.Store',

    storeId: 'orderStore',
    proxy: {
        type: 'ajax',
        api: {
            read: 'Order/Load',
            create: 'Order/Add',
            update: 'Order/Update',
            destroy: 'Order/Delete'
        },
        reader: {
            type: 'json',
            root: 'orders',
            totalProperty: 'total',
            messageProperty: 'message',
            successProperty: 'success'
        },
        writer: {
            type: 'json',
            listful: true,
            writeAllFields: true,
                    getRecordData: function (record) { return record.data; },
            root: 'order',
            allowSingle: true
        },
        headers: { 'Content-Type': 'application/json; charset=UTF-8' }
    },
    autoLoad: true,
    listeners: {
        // commit changes
        write: function (store, operation, eOpts ) {
            var orderItemsStore = OrderEdit.store;
            orderItemsStore.each( function (item) {
                item.commit();
            });

            // ...
        }
    }
});

где:

Ext.define('OrderEdit', {
    // ...
    orderStore: Ext.create('OrderStore', {model: 'Order', owner: this}),
    store: Ext.create('OrderItemStore')

и

Ext.define('OrderItemStore', {
    extend: 'Ext.data.Store',

    model: 'Order',
    proxy: {
        type: 'memory'
    }
});

и сохраните изменения:

saveButtonClick: function (button) {
    var order = OrderEdit.orderStore.getRange()[0];
    res = order.data;
    res.Items = [];
    OrderEdit.store.each(function (record, index) {
            res.Items[index] = record.data;
    });
    // ...

    OrderEdit.orderStore.removeAll();
    OrderEdit.orderStore.add(res);
    OrderEdit.orderStore.save();
}
1 голос
/ 01 сентября 2011

Я решил ту же проблему, создав собственный Writer (в моем случае расширение Ext.data.writer.Json).В вашем сценарии это будет использоваться в качестве автора для магазина заказов.Мое хранилище продуктов доступно только для чтения (я никогда не синхронизирую его с сервером).

Мой модуль записи переопределяет функцию getRecordData ().Сначала он выполняет стандартную обработку getRecordData () для получения данных заказа, затем перебирает записи в хранилище продуктов, чтобы создать массив записей продуктов.Затем я добавляю этот массив к данным заказа (с ключом «Продукты».

...