2010-12-08 6 views
3

Я создал компонент сетки с конфигурацией хранилища, как это:Extjs Restful Store, Отправляющий запрос в Batch?

//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. Этот магазин настраивается в общем настраиваемом компоненте Grid.

Однако у меня есть одна проблема: какие бы CRUD-действия я ни делал, я всегда получаю N запросов к серверу, который равен N строкам, которые я выбрал. то есть, если я выберу 10 строк и удалю Delete, на сервер будет отправлено 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,

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

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

Примечание: Я попытался с listful, encode, writeAllFields, encodeDelete в Ext.data.JsonWriter ... без надежды

ответ

2

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

+0

Эй, спасибо большое за ваш ответ. Я думал, что это одна из ошибок конфигурации, которые я сделал, что поднимает эту проблему, по крайней мере, вы подтвердили ее со мной. – 2010-12-09 02:23:31

+0

Мне интересно, сохранилось ли это в ExtJS 4.1.3? – justinzane 2012-11-16 23:25:32

6

Только для тех, кто мог бы задаться вопросом, почему это не партия:

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

Если магазин является 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.