2010-12-08 6 views
3

Extjs Restful Store、バッチでリクエストを送信しますか?

 //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 
      } 

     } 
    }); 

注:fireEventを無視してください。このストアは共有カスタムグリッドコンポーネントで構成されています。

ただし、私はここで1つの問題があります。私がした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(); 
}, 

注:thisの範囲はグリッドコンポーネントです。

だから、そういうことになっていますか?または私の構成上の問題? 私はExtjs 3.3.1を使用しています。また、Ext.data.Store、

の下のbatchのドキュメントに従ってStoreがRESTfulならDataProxyもRESTfulであり、レコードごとに一意のトランザクションが生成されます。

これは私の設定上の問題です。

注:私はlistfulencodewriteAllFieldsencodeDeleteExt.data.JsonWriterを試しました...希望がない

答えて

2

で...、writeAllFieldsencodelistfulExt.data.JsonWriterencodeDeleteを試してみました。それはそのように働くことになっています。これは、RESTfulストアをグリッドに使用するかどうかを選択するたびに検討するものです。バッチ操作が必要な場合、RESTfulストアはあなたの友人ではありません。ごめんなさい。ただ、それはバッチではない理由を不思議に思うかもしれない人のために

+0

お返事ありがとうございました。これは私がこの問題を提起した設定ミスの1つだと思っていましたが、少なくともあなたは私と一緒にそれを確認しました。 –

+0

これはExtJS 4.1.3でもまだ成立しているのでしょうか? – justinzane

+0

@justinzane - 私はExtJS 4について知りません。この質問はExtJS 3についてのものです。 v4の静かなバッチリクエストについて質問することは、おそらくそれ自身の質問に値するでしょう。 – wes

6

:述べた文書については

StoreがRESTfulな場合には、DataProxyもRESTfulなで、ユニークなトランザクションがそれぞれのために生成されます記録。 @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); 
} 

であなたが/src/data/Store.js

ライン309にExt.data.Storeのソースコードに見れば真である

、そして、私はrestfulを使用するときに私が気付いてなぜこれが、私のbatch決してtrueに変更されることはありません。

+1

優秀な回答!私のPOVから迷惑を完全にfscking、それはあなたのせいではありません。SenchaがRESTfulトランザクションごとに1つのxmlhttprequestが必要だと思うのは、ちょっと不思議です。バッチ処理は状態マッチングの前提を変更していないようです。 – justinzane

+0

うわー、ありがとう。しかし、これはちょっと古いです(2010年)!これは既存のv4.1にも適用されますか? Lolx! –

関連する問題