読者です 読者をやめる 読者になる 読者になる

AutoCompleteTextField で Bean を使う場合

Wicket Autocomplete は、AJAX
 org.apache.wicket.extensions.ajax.markup.html.autocomplete.AutoCompleteTextField;
と、jQuery
 com.googlecode.wicket.jquery.ui.form.autocomplete.AutoCompleteTextField
がある。

今回は、jQuery の方、Maven の グループIDは、com.googlecode.wicket-jquery-ui で持ってきて使うケースである。

文字列 String の Autocomplete は簡単に作れるが、Java Bean の場合は、
ちょっと工夫が必要。

選択されたイベントで実行される AutoCompleteTextField の
onSelected をオーバライドして、
任意の Hidden フィールドに、表示しないキー値をセットするのである。

例えば、Item というクラスの Bean があったとして以下のようにする。

final HiddenField<String> hid = new HiddenField<String>("hid", new Model<String>());

final AutoCompleteTextField<Item> itemName = new AutoCompleteTextField<Item>("item", new Model<Item>()){
   @Override
   protected List<Item> getChoices(String input){
      if (Strings.isEmpty(input)){
         // キー入力が空の場合は、空リスト返す。
         //  Strings は、org.apache.wicket.util.string.Strings というマークアップ言語文字列を使うのに便利なもの

         return Collections.emptyList();
      }
      return /* DBなどで LIKE検索した結果のリストを返す。*/
   }
   @Override
   protected void onSelected(AjaxRequestTarget target){
      Item item = this.getModelObject();
 // ← this で持ってくる!
      // hiddenフィールドにセットする。
      target.appendJavaScript("$('#hid').val(" + Integer.toString(item.id) + ");");
   }

};


後は、Form の onSubmit で、これらの Textfield は、final 宣言してるので、
好きに Hidden フィールドの Model 値を取得すれば良い。