2008年5月25日日曜日

AjaxRequestTarget#addComponent()

要求としては、del.icio.usのブックマーク登録時に使用するような「タグの入力補完」の機能を実現するために、「ListViewで表現しているタグのList」を「特定のTextFieldの値でフィルタする」、それをAjaxで更新したい、という単純なもの。Wicketは1.3.3。
Modelを作成するLogicはいいとして、それをAjaxRequestTargetにaddComponent()する時に困った。AjaxRequestTarget#addComponent()でListViewを渡すと以下のようなExceptionが発生する。

This component is a repeater and cannot be repainted via ajax directly. Instead add its parent or another markup container higher in the hierarchy.
となる。AbstractRepeaterのインスタンスをaddComponent()するとAjaxRequestTarget#addComponent(Component component, String markupId)内で上記のIllegalArgumentExceptionが投げられるようになっている。
結局、ListViewをdiv wicket:id="ListViewContainer"みたいな要素の内側に配置して、ajaxRequestTarget#addComponent()にこのContainerを渡す、みたいな方法をとった。で、このContainerの実装として「org.apache.wicket.markup.html.border.BoxBorder」を使用した。
これでちゃんと動作しているから、困ってるという訳でも無いかもしれんけど、気分的には、こういう時に使うPanelとかBoxみたいなContainerとしてしか機能がないContainerを使いたい、あんまキレイじゃない、という気分。
それか、独自のListViewを使って解決するのがいいのか。Wicket使ってる他のみんなはこういぅ時(RepeaterをaddComponent()したいとき)にどーしてるんだろ?

コメントを投稿