Extjs Restful Store, отправка запроса в пакетном режиме?

Я создал компонент Grid с такой конфигурацией магазина:

    //Create the store
    config.store = new Ext.data.Store({
        restful: true,
        autoSave: false,
        batch: true,
        writer: new Ext.data.JsonWriter({
            encode: false
        }),
        reader: new Ext.data.JsonReader({
            totalProperty: 'total',
            root: 'data',
            fields: cfg.fields
        }),
        proxy: new Ext.data.HttpProxy({
            url:cfg.rest,
            listeners:{
                exception: {
                    fn: function(proxy, type, action, options, response, arg) {
                        this.fireEvent('exception', proxy, type, action, options, response, arg);
                    },
                    scope: this
                }
            }
        }),
        remoteSort: true,
        successProperty: 'success',
        baseParams: {
            start: 0,
            limit: cfg.pageSize || 15
        },
        autoLoad: true,
        listeners: {
            load: {
                fn: function() {
                    this.el.unmask();
                },
                scope: this
            },

            beforeload: {
                fn: function() {
                    this.el.mask("Working");
                },
                scope: this
            },
            save: {
                fn: function(store, batch, data) {
                    this.el.unmask();
                    this.fireEvent('save', store, batch, data);
                },
                scope: this
            },

            beforewrite: {
                fn: function(){
                    this.el.mask("Working...");
                },
                scope: this
            }

        }
    });

Примечание. Игнорируйте файл fireEvents. Это хранилище настраивается в общем пользовательском компоненте сетки.

Однако у меня есть одна проблема: какие бы действия CRUD я ни выполнял, я всегда получаю N запросов к серверу, что равно N выбранным мной строкам. т. е. если я выберу 10 строк и нажму Удалить, на сервер будет отправлено 10 запросов DELETE.

Например, вот как я удаляю записи:

/**
 * Call this to delete selected items. No confirmation needed
 */
_deleteSelectedItems: function() {
    var selections = this.getSelectionModel().getSelections();
    if (selections.length > 0) {
        this.store.remove(selections);
    }
    this.store.save();
    this.store.reload();
},

Примечание. Областью действия «это» является компонент сетки.

Значит, так и должно быть? Или моя проблема с конфигурацией? Я использую Extjs 3.3.1 и, согласно документации batch в Ext.data.Store,

Если Store использует RESTful, DataProxy также поддерживает RESTful, и для каждой записи создается уникальная транзакция.

Я хочу, чтобы это была моя проблема с конфигурацией.

Примечание. Я пробовал с listful, encode, writeAllFields, encodeDelete в Ext.data.JsonWriter... безрезультатно


person Lionel Chan    schedule 08.12.2010    source источник


Ответы (2)


Вы правильно прочитали документы; это должно работать именно так. Это следует учитывать при выборе использования хранилищ RESTful в ваших сетках. Если вам понадобятся пакетные операции, магазины RESTful не ваши друзья. Прости.

person wes    schedule 09.12.2010
comment
Привет, Вес, большое спасибо за твой ответ. Я думал, что это одна из ошибок конфигурации, которые я сделал, что поднимает эту проблему, по крайней мере, вы подтвердили это со мной. - person Lionel Chan; 09.12.2010
comment
@justinzane - я не знаю о ExtJS 4. Этот вопрос конкретно о ExtJS 3. Вероятно, стоит задать собственный вопрос о пакетных запросах v4. - person wes; 17.11.2012

Просто для тех, кто может задаться вопросом, почему это не партия:

Что касается заявленной документации,

Если Store использует RESTful, DataProxy также поддерживает RESTful, и для каждой записи создается уникальная транзакция.

Что верно, если вы посмотрите на исходный код Ext.data.Store в /src/data/Store.js

Строка 309, в @constructor

// If Store is RESTful, so too is the DataProxy
if (this.restful === true && this.proxy) {
    // When operating RESTfully, a unique transaction is generated for each record.
    // TODO might want to allow implemention of faux REST where batch is possible using RESTful routes only.
    this.batch = false;
    Ext.data.Api.restify(this.proxy);
}

Вот почему я понимаю, что когда я использую restful, мой batch никогда не изменится на true.

person Lionel Chan    schedule 09.12.2010
comment
Отличный ответ! Совершенно чертовски раздражает, с моей точки зрения, но это не твоя вина. Мне любопытно, почему Сенча считает, что для отдыха требуется один xmlhttprequest для каждой транзакции RESTful. Пакетная обработка, по-видимому, не меняет предпосылки сопоставления состояний. - person justinzane; 18.11.2012
comment
Вау, спасибо. Но это старое (2010)! Это все еще применимо к существующей версии 4.1? Лолкс! - person Lionel Chan; 19.11.2012