2012-02-02 20 views
1

ExtJSのバージョンはext-4.0.7-gplです。ExtJSでストアの自動同期を無効にする方法

Storeを同期すると、サーバーは同じオブジェクトをJSON形式で返しますが、生成されたIDはストアデータに格納する必要があります。識別子は、次のように囲まれたエンティティにあります。

{ 
    "id":46, 
    "name":"Excel", 
    "typeExt":[ 
     { 
      "ext":"xls", 
      "id":"137", 
      "isMain":"false", 
     }, 
     { 
      "ext":"xslx", 
      "id":"136", 
      "isMain":"false", 
     } 
    ] 
} 

したがって、ids 137と136はサーバサイドで生成されます。

私は店のプロキシ(編集:Ajaxのタイプ)でそれを作るためにしようとしています(それ自体が間違っている可能性):

proxy.afterRequest = function(request){ 
     if(request.action === 'create' && request.records.length==1){ 
       me.store.autoSync = false; 
       var created = Ext.JSON.decode(request.operation.response.responseText); 
       request.records[0].set('id', created.id); 
       request.records[0].set('typeExt', created.typeExt); 
       //request.records[0].modified = {}; 
       //request.records[0].dirty = false; 
       me.store.autoSync = true; 
     } 
     if(request.action === 'update' && request.records.length==1){ 
       var updated = Ext.JSON.decode(request.operation.response.responseText); 
       me.store.autoSync = false; 
       request.records[0].set('typeExt', updated.typeExt); 
       me.store.autoSync = true; 
     } 

    }; 

はコメントバリアントを参照してください。

autoSyncをfalseに設定しないと、無限にループします。

「変更された」フィールドと「ダーティー」フィールドをクリアしないと、変更されたレコードが次の同期要求に含まれます。別のレコードを編集すると、のレコードサーバーサイドのサービスが壊れてしまいます。

コメント行に表示されているように「ダーティ」および「変更済み」をクリアした場合、更新操作は1回だけ実行されます。 RowEditingプラグインダイアログのUpdateボタンを押しますが、2回目に必要なリクエストをサーバーに送信しません。

後者の場合、私は手書きのフィールドを手で編集して何かを壊したと思いますが、何が見つかりませんか?

人々は通常どのように問題に対処していますか?

PS。 request.records [0] .commit(true); || request.records [0] .editing = false; || request.records [0] .beginEdit(); seccessも無かった。

答えて

2

これは、グリッドストアでExt 4.0.7を使用していますが、ツリーストアでも同様の問題があります。これはすべて直接プロキシで(そしてオート・シンク・トゥルーで)

Ext.data.Store::onCreateRecordsのコードを見ると、ストアレコードがサーバーから返されたものに置き換えられていることがわかります注文は同じです。

これはとても簡単です。createメソッドに送信されたidと同じjson /オブジェクトをサーバーから返して、ストアで自動的に更新する必要があります。

私はこれがあまり役に立たないと知っていますが、おそらくあなたにある方向性を与えるでしょう。

は、私はあなたが言及した場合、それが役立つだろうと思う:

  • あなたは
  • 正確な内線バージョンおそらく
  • を使用しているプロキシのタイプの記録
の作成を開始するコード
+0

ありがとうございます!コードはかなり面倒です。 'Picker'は、' typeExt'サブ配列を編集するためのグリッドを開きます。 'valueToRaw'と' rawToValue'の2つのメソッドがあります。これらのメソッドは、 'extEx'フィールドの連結によって作られた' typeExt'配列からStringを作ります。実際には 'Picker'では動作しますが、連結されたStringを手作業で編集して汎用的な' typeExt'配列を作ることができるようにしたいと考えています。私はそのコードをデバッグして、それに応じて 'pickerfield'が更新されるようにしました...もし私がautoSyncを一時的に無効にする方法を見つけたら、問題は残っています。 – fedd

+0

あなたの答えは私の質問のためだけではありませんが、私の問題を解決する助けになりました。私はあなたの答えを受け入れたいと思いますが、それは私が推測するサイトのルールではありません。 「あなたは自動同期を無効にする良い方法はありません」という回答を修正することができます。それを受け入れるでしょうか? – fedd

3

これはExt 4.0.7ではあまり役に立たないが、suspendAutoSyncresumeAutoSyncメソッドがExt 4.1.0で追加された。うまくいけば、これは他の誰かにとって役に立ちます。

関連する問題