見つけた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、私に教えてください。私はこの機能を達成するための組み込みの方法で幸せになるでしょう。)
良いfind。いくつかのコードを共有することは恥ずかしがり屋ではありません:)誰かが知っている、おそらくある日は役に立つでしょう。 – dbrin
@DmitryB OK、自分で説明しました – Geronimo
あなたのユースケースは多くのものに似ていると思います。私の経験では、あなたのモデルのID属性が 'int'型の場合、デフォルトのプロキシはsync()を実行するときに正しいことを行います。私は自分のIDプロパティを文字列にしていたので、説明したように、同期操作が失敗しました。基本的に私のグリッドレコードはサーバに同期されていても常に「汚い」フラグを表示します。 – dbrin