Wicket に AjaxChannel という Class があることを知りました。
Ajax 関連機能 の Optiion 設定値になるのですが、設定した際の動作の変更点が興味深かったので、記載します。
参考
以下、参考にしています。
-
AjaxChannel (Wicket Parent 6.30.0-SNAPSHOT API)
Wicket の JAVADOC に AjaxChanel についての記載があります。 -
Java Code Examples org.apache.wicket.ajax.AjaxChannel
AjaxChannel の 使用例
AjaxChannel 設定値について
以下、3つの Channel 設定があります。
-
queueing
Ajax リクエストが、クライアント側のキューに保持されます。キューに格納されたデータは、一度に 1 つずつ処理されます。
デフォルト動作です。 -
drop
最後の Ajax リクエストのみが処理され、その前のリクエストはすべて破棄されます。 -
active
実行中の Ajax リクエストがある場合、先勝ちになります。
Ajax を並列で動作させる場合
実行したかったことは、こちらになります。
同一のChannel だと、AjaxChannel の動作で、シリアル実行される
ので、Channel 名を変えると、AjaxChannel の設定に寄らず、並列実行される
になります。
以下、実装例を記載します。
AjaxRequestAttributes
に AjaxChannel を設定する interface があります。
-
AjaxChannel Examples
// firstLink とは、別のChannelになるので、Blockされない。 AjaxLink previousLink = new AjaxLink(ID_PREVIOUS_LINK) { @Override protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { attributes.setChannel(new AjaxChannel("blocking", AjaxChannel.Type.ACTIVE)); } @Override public void onClick(AjaxRequestTarget target) { previousPerformed(target); } }; // previousLink とは、別のChannelになるので、Blockされない。 AjaxLink firstLink = new AjaxLink(ID_FIRST_LINK) { @Override protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { attributes.setChannel(new AjaxChannel("queueing", AjaxChannel.Type.QUEUE)); } @Override public void onClick(AjaxRequestTarget target) { firstPerformed(target); } };
-
使う際の考慮事項
AjaxChannel は、Channel (キュー) の指定と、Channel の動作の制御ができます。
使い方のポイントとして以下があるかと思いますので記載します。-
Chnannel の単位は設計する。
Ajax コンポーネントは、種類によって、どのChannel を使用するか、Channel の 振る舞いはどうすべきかは設計必要に思いました。 -
1つのChannel で、協調させる。
これは試してないので、もしかしたらうまく動かない可能性がありますが、複数のボタンを同じChannel にして、振る舞いを制御することも可能なのかなと思いました。 -
単純な連打防止
連打制御という意味だと、DROP 、もしくは、ACTIVE にしておくのがよいかと思いました。
時間がかかる処理だと、ACTIVE ですぐに完了する処理だと、DROPでしょうか。
-
以上です。
コメント