Extjs Restful Store,批量发送请求?

时间:2010-12-08 11:02:15

标签: javascript rest extjs store extjs3

我创建了一个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();
},

注意:“this”的范围是网格组件。

那么,它是否应该是那样的?还是我的配置问题? 我正在使用Extjs 3.3.1,并根据Ext.data.Store下的batch文档,

  

如果Store是RESTful,DataProxy也是RESTful,并为每条记录生成一个唯一的事务。

我希望这是我的配置问题。

注意:我尝试了listful中的encodewriteAllFieldsencodeDeleteExt.data.JsonWriter ......没有希望

2 个答案:

答案 0 :(得分:6)

只为那些可能想知道为什么不批处理的人:

至于所述文件,

  

如果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

答案 1 :(得分:2)

您正确阅读了文档;它应该以这种方式工作。无论何时选择是否在网格上使用RESTful存储,都需要考虑这个问题。如果您需要批量操作,RESTful商店不是您的朋友。遗憾。