当社Webサイト

カテゴリー

Amazonサーチ

  • 09/29
    Java, Wicket post by 武輪 恭代 @ 2009 年 9 月 29 日 17:20

    ども、武輪です。

    前回の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

    あわせて読みたい

    Tags:

One Response

WP_Cloudy