TableのページリンクをAjax化する
Click ExampleにあるTable Ajax Page
http://click.avoka.com/click-examples/ajax/table/table-ajax.htm
には、TableコンポーネントのページリンクをAjax化する方法が示されていますが、S2ClickのAjaxLinkを使用すると、もっと簡単に同じことを実現することができます。
S2ClickPageを継承したPageクラスを作成し、その中でTableを継承したインナークラスを宣言します。
ここで、Table#getControlLinkメソッドをオーバーライドして、ActionLinkの替わりにAjaxLinkのインスタンスを返します。
public class AjaxLinkInTablePage extends S2ClickPage { ... public Table table = new Table() { @Override public ActionLink getControlLink() { if (controlLink == null) { AjaxLink al = new AjaxLink(AjaxLinkInTablePage.this, "onPageMove"); al.addAjaxHandler(AjaxUtils.ON_COMPLETE, "movePageComplete"); controlLink = al; } return controlLink; } }; ...
onPageMoveはリンクがクリックされた際にJava側で呼び出されるメソッド名です。
movePageCompleteは、レスポンスが正常に返った後に呼び出されるJavaScript側の関数名です。
onPageMoveでは、S2ClickPage#renderJSONを使用し、テーブルのHTMLをJSONのレスポンスとして戻します。
public class AjaxLinkInTablePage extends S2ClickPage { ... public boolean onPageMove() { Map<String, Object> jsonObj = new HashMap<String, Object>(); jsonObj.put("tab", table.toString()); renderJSON(jsonObj); return false; } ...
movePageCompleteでは、サーバから受け取ったJSONをパースし、その内容でHTMLを書き換えます。
... <head> $imports <script> var movePageComplete = function (res) { var json = eval('(' + res.responseText + ')'); $('tab').innerHTML = json['tab']; }; </script> </head> <body> <div id="tab"> $table </div> ...
以下、今回書いた全サンプルコードです。