ども、武輪です。
前回のWicket小話で、Confirmメッセージを出すにはどうすればよいのか?と言った話をしたのですが、今回も引き続きConfirmメッセージの話をしたいと思います。
前回、AjaxボタンでConfirmメッセージを表示する方法として、Wicket-extensionのコンポーネントであるModalWindowを使い、独自のポップアップメッセージを表示する方法をとりました。
しかしながら、これってぶっちゃけConfirmメッセージじゃないよね…!
というわけで今回はAjaxボタンで正真正銘(?)のConfirmメッセージを表示する方法をご紹介します。
AjaxボタンでConfirmメッセージ
>Ajaxで中身を入れ替える以上、onclickアトリビュートをいじるのはややこしそうなので…
と前回書いたのですが、
「confirmで確認後、OKだったら既存AjaxのJavaScriptを実行してあげて、キャンセルだったらfalseを返す」
ようなJavaScriptを書けば問題ないんじゃ…?と思いまして。
そんなわけでさらっとサンプルを書いてみました。
サンプルは前回同様、ボタンを押した時に確認メッセージを表示し、OKだったらカウントする、キャンセルだったら何もしない、といった仕様です。
Confirm2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | public class Confirm2 extends WebPage{ private int count = 0; private Label result; /** * コンストラクタ */ public Confirm2() { add(result = new Label("result", new PropertyModel<Integer>(this, "count"))); result.setOutputMarkupId(true); Form<?> form = new Form<Confirm2>("form"); form.add(new AjaxButton("count", new Model<String>("カウントしますか?")){ private static final long serialVersionUID = 1L; @Override protected void onSubmit(AjaxRequestTarget target, Form<?> form) { count++; target.addComponent(result); } @Override protected IAjaxCallDecorator getAjaxCallDecorator() { return new AjaxPreprocessingCallDecorator(super.getAjaxCallDecorator()) { private static final long serialVersionUID = 1L; @Override public CharSequence preDecorateScript(CharSequence script) { return "if(!confirm('" + getModelObject() + "')) return false;" + script; } }; } }); add(form); } } |
【メモ】
25~34行目付近:
AjaxButtonのgetAjaxCallDecoratorをオーバライドしてあげることで、出力されるAjax用JavaScriptに手を加えています。
実際に出力されるhtmlは以下のようになります。
onclick="if(!confirm('カウントしますか?')) return false;var wcall=wicketSubmitFormById('form2', ';[長いので略]"
まとめ
というわけで、AjaxButtonでも前回みたいな似非確認ダイアログではなくちゃんとした(?)Confirmメッセージを出すことができました。
AjaxButtonを記述する度にgetAjaxCallDecorator()をオーバライドするのも面倒なので、AjaxButtonを継承したサブクラスを作っておくのが便利そうです。
動作環境
今回のサンプルソースは以下の環境で動作させています。
| バージョン | |
|---|---|
| JDK | 1.6.0_13 |
| Apache Tomcat | 6.0.16 |
| Apache Wicket | 1.4.0 |




