2012-05-09 8 views
5

Ext.data.Operationを拡張してカスタムcommitRecordsメソッドを実装しました。プロキシを使用する拡張Ext.data.Operation

Ext.data.Operationクラスは、ストアとプロキシ間のすべての通信に使用されます。

commitRecordsメソッドは、特に、プロキシライターから返されたデータに従ってデータストア内のデータを更新するために使用されます。

Ext.data.Operationの拡張バージョンを使用するためにプロキシを設定する方法についてはわかりません。

私はExt.data.*パッケージを介して旋条してきたが、私は、カスタムcommitRecords方法でこの新しい拡張Ext.data.Operationクラスを使用することを伝えるためにどのようなクラスを知っているだろうので、Ext.data.Operationが作成された場所を見つけることができないようです。

他の誰もこれを拡張してくれましたか?

答えて

4

見つけたbatchの方法Ext.data.Proxyは、Ext.data.Operationオブジェクトがサーバーに送信するために作成された場所です。

私はExt.data.proxy.Ajaxを新しいbatchメソッドで拡張しました。ここで私は自分のOperationクラスのためにnew Ext.data.Operationをスイッチアウトします。

EDIT

あなたはDmitryBを尋ねただけですので。私が自分自身のcommitRecordsメソッドを実装しなければならなかった理由についての短い話は、実際のデータベースレコードIDフィールドに一致するデータモデル "internalId"フィールドが必要だったということです。私はまさに、それは私が表現するのはあまりにも複雑だが、ここで私がやったことだ理由にはなりません。

私はそれを理解する方法store.sync()を呼び出すときに、commitRecordsメソッドは、最後のアクションの一つとして発射されると自動的に置き換えられますサーバー側のコントローラを作成してAjaxレスポンスの新しいサーバーレコードを返す限り、新しいサーバー側のレコードをクライアント側に置いてダーティなレコードを作成します。これは、同期要求が挿入または更新を行うたびに実行されます。

commitRecordsの正式な実装では、データモデルの「internalId」フィールドを使用して、この返されたサーバーレコードをダーティクライアントレコードに一致させようとします。

明らかに、次のインクリメンタルデータベースIDが新しいレコードのためにどのようなものになるかはわからないので、レコードがデータベースと同期する前にIDとしてクライアント側に割り当てることはできません。 matchは、commitRecordsが呼び出されたときに、汚れたクライアントレコードのinternalIdと照合することができます。つまり、クライアントレコードは、必要な正しいデータベースIDを取得しません。 「CREATE_TIME」フィールドを持って、このアプリのための私の書き込み可能なデータモデルのすべてので

だから、私はcommitRecords方法ではなく、「internalId」の「CREATE_TIME」フィールドを使用してクライアントレコードとサーバーのレコードを一致させることにしました。

ここに拡張されたExt.dataがあります。私はこれをしたOperationクラスは、:私は答えで述べたように

Ext.define('MyApp.ux.QueryOperation', { 
    extend: 'Ext.data.Operation', 

    /** 
    * Use the date_created timestamp if we cant match to an ID. 
    * This allows client records that did not previously exist on the server 
    * to be updated with the correct server ID and data 
    * NB: All implementing data models require a "date_created" field. 
    */ 
    commitRecords: function (serverRecords) { 
     var me = this, 
      mc, index, clientRecords, serverRec, clientRec; 
     if (!me.actionSkipSyncRe.test(me.action)) { 
      clientRecords = me.records; 
      if (clientRecords && clientRecords.length) { 
       if (clientRecords.length > 1) { 
        mc = new Ext.util.MixedCollection(); 
        mc.addAll(serverRecords); 
        Ext.each(clientRecords, function(clientRec) { 
         serverRec = mc.findBy(function(record) { 
          var clientId = clientRec.getId(), 
           clientTime = clientRec.get('date_created').getTime(), 
           serverTime = record.get('date_created').getTime(); 
           if(clientId && record.getId() === clientId) { 
            return true; 
           } 
           // timestamp can be within 2ms of record 
           // (it seems to change slightly in serialization) 
           return (clientTime > serverTime - 2 && clientTime < serverTime + 2); 
         }); 
         me.updateClientRecord(clientRec, serverRec); 
        }); 
       } else { 
        clientRec = clientRecords[0]; 
        serverRec = serverRecords[0]; 
        me.updateClientRecord(clientRec, serverRec); 
       } 
       if (me.actionCommitRecordsRe.test(me.action)) { 
        for (index = clientRecords.length; index--;) { 
         clientRecords[index].commit(); 
        } 
       } 
      } 
     } 
    }, 

}); 

、私は私の新しいOperationクラスを利用するためにプロキシを拡張するために持っていたことが分かりました。私が拡張したのはbatchメソッドだけでしたが、(上記の新しいOperationクラス)と言うメソッドの2行だけを置き換えました。これは、応答がサーバーから戻ったときに自分のcommitRecordsメソッドを呼び出したときに発生します。私はまた、別名「proxy.query」私はこのようにそれを使用するために私の店を言うことができるように拡張されたプロキシを与えた:

Ext.define('MyApp.store.MyStore', { 
    extend: 'Ext.data.Store', 
    requires: [ 
     'ST.ux.QueryProxy', 
    ], 
    title: 'Student', 
    model: 'MyApp.model.MyModel', 
    proxy: { 
     type: 'query', 
     // ... ^^^^^ uses my QueryProxy now 
     // other configs... 
    } 
}); 

(それが思われる場合、私はこの間違った方法についてのだろうかで何かを逃していますようにdocs、私に教えてください。私はこの機能を達成するための組み込みの方法で幸せになるでしょう。)

+0

良いfind。いくつかのコードを共有することは恥ずかしがり屋ではありません:)誰かが知っている、おそらくある日は役に立つでしょう。 – dbrin

+0

@DmitryB OK、自分で説明しました – Geronimo

+0

あなたのユースケースは多くのものに似ていると思います。私の経験では、あなたのモデルのID属性が 'int'型の場合、デフォルトのプロキシはsync()を実行するときに正しいことを行います。私は自分のIDプロパティを文字列にしていたので、説明したように、同期操作が失敗しました。基本的に私のグリッドレコードはサーバに同期されていても常に「汚い」フラグを表示します。 – dbrin

関連する問題