PDA

View Full Version : ajax通信のダブルクリック処理



ak_ext
15 Jun 2009, 9:35 PM
ext2.2.1
検索したデータをグリッドに表示するのajax通信しているのですが、
検索ボタンを連打すると、javascriptエラー通信エラーが発生してしまいます。
これは画面側でダブルクリック対応
ボタン押下→フラグを立てる→通信→通信終了loadハンドラで戻す
などを各画面に埋めこないといけないのでしょうか?

それともextの機構で連続通信を防ぐ方法などがあるのでしょうか

Tommy1969
16 Jun 2009, 1:50 AM
ext 機構に心当たりはありませんねぇ…。

とりあえず、ボタンを disable にするのがよろしいかと。その際、load イベントを拾うよりも、callback を使った方が実装が綺麗になると思います。

こんな感じで。



var search = function(btn, evt) {
btn.setDisabled(true);
var finish = function(recs, opt, success) {
btn.setDisabled(false);
};
store.load({callback:finish})
};

kiyoto01
23 Jun 2009, 1:17 AM
Ext.Ajax.autoAbort を true にしてみてはどうでしょう。
これは、一度にひとつの Ajax 通信しかできないようにするやつだったと思います。

あるいは、Ext.Ajax の beforerequest あたりをハンドリングして、
なにかごちょごちょやる、という手もあるかと思います。
この場合は、通信スケジューリングを管理するシングルトンのマネージャなんかを立てておくとよいでしょう。
(ComponentMgr 等と同じです)

ak_ext
24 Jun 2009, 8:53 PM
追加削除などのボタン押下時はajax通信 
検索のボタン押下時はstoreでやっています。

追加削除などは確認ダイアログが出るので、ダブルクリック制御しなくても大丈夫なのですが、
検索時の制御で

Store = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({url: "", method: "POST"}),
reader: reader,
listeners: {
load :function(GridEx, o, response ) {

},
loadexception :function(SearchClientGridEx, o, response, e) {

}
}
});
と書いているのですが、
storeはajax通信でいうautoAbortみたいには
できないのでしょうか。

ボタンを連打すると、loadexceptionで拾えず、
javascriptエラーが出ています。

kiyoto01
25 Jun 2009, 4:59 AM
Ext.Ajax は、Ext.data.Store などから標準で使用される Ext.data.Connection のシングルトンのインスタンスである、というのに過ぎないもので、store.proxy.conn に Ext.data.Connection の別のインスタンスを設定すれば、その Connection 設定で通信されます。

デフォルトの Ext.Ajax の挙動を autoAbort にしたいのであれば、初期化時の適当なタイミング (Ext.onReady の冒頭等) で、Ext.Ajax.autoAbort = true; という一文を書いていただければ、それ以降のすべての通信が、パラレルではなくて、シリアルになるはずです。



Ext.onReady({
Ext.Ajax.autoAbort = true;

something_to_do;
});
パラレルのものと、シリアルのものを併用したい場合は、Ext.data.Store によって、使用する conn を分けてあげるとよいでしょう。



Ext.SerialAjax = new Ext.data.Connection({
autoAbort: true
});
Ext.onReady(function() {
var seriealStore = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({
conn: Ext.SerialAjax
})
});
});
serialStore.load({
...
});
ボタンを連打すると loadexception で拾えないのは、うーん、なんででしょうね。
ひとつの Store で、複数のロードを同時に行っていると、1 回目のロードの結果が来たのか、2回目のロードがきたのか、機構的には、判別がつかないです。そのあたりが原因のエラーかもしれません。


1st Store.load
2nd Store.load
2nd Store.onLoad
1st Store.onLoad

上記のような順番になることは、サーバ側の処理内容によって十分起こりえます。
もちろん、サーバ側が Ajax のリクエストに対して排他処理を行っていれば別ですが、まあ、普通は、並列に走って、はやく終わったほうがはやく返る、というのが筋なので、前後する可能性がある、ということですね。

そのあたりで、返信内容の混線が起こらないか (つまり、2つの query が同時に来た場合の、response の保護は十分か) というあたりを確認してみるとよいかもしれません。
とくに、load の内容が、サーバ側の DB を更新する write 系の要求だと、サーバ側の排他、もしくはクライアント側の排他が必要になります。
クライアント側の排他は、同時にふたつのブラウザからアクセスが来た場合に、原理的にいって排他ができないので、サーバ側の排他をきちんとするのがお勧めです。

というのは、回答になっていますでしょうか?