[Wicket-ja-user 110] Form内でListViewを使った場合の挙動について

Zurück zum Archiv-Index

koyane koyan****@gmail*****
2008年 6月 4日 (水) 19:19:44 JST


日置と申します。

Form内でListViewを使った以下のような画面を作ったのですが、
思ったような挙動をしてくれず困っています。

具体的に言うと、親のオブジェクトのフィールドに関しては
あたりまえですが、問題なく動作するのですが、
ListViewで処理している子のオブジェクトの入力フィールドの
入力内容が入力チェックでエラーとなった場合のみ破棄されてしまいます。

defaultFormProcessingをfalseにした場合にも同様の動作をするので、
何かそこらへんに原因があるのかなあとは思っているのですが、
Formの処理サイクルがまだ理解できていないので、問題の解決に
たどり着けないでいます。
このような状況でListViewで処理している子のオブジェクトの入力フィールドの
入力情報を保持することは可能でしょうか?

public class TestPage extends WebPage {

  public TestPage(){
    //フィードバックパネル
    add(new FeedbackPanel("feedback"));
    //編集対象データ
    IModel<Entity> model = createEntry();
    //フォーム
    Form<Entity> form = new Form<Entity>("form",model);
    //親エントリーのフィールド
    TextField<String> name = new TextField<String>("name");
    name.add(StringValidator.minimumLength(5));
    name.setRequired(true);
    form.add(name);
    //子エントリーのフィールド
    ListView<Entity> checks = new ListView<Entity>("checks"){
      private static final long serialVersionUID = 1L;
      @Override
      protected void populateItem(ListItem<Entity> item) {
        List<Integer> years = Arrays.asList(2008,2009,2010);
        item.add(new DropDownChoice<Integer>("year", years));
        item.add(new CheckBox("check"));
      }
      @Override
      protected IModel<Entity> getListItemModel(IModel<List<Entity>>
model, int i) {
        List<Entity> list = model.getObject();
        return new CompoundPropertyModel<Entity>(list.get(i));
      }
    };
    form.add(checks);
    //submitボタン
    form.add(new Button<String>("submit"){
      private static final long serialVersionUID = 1L;
      @Override
      public void onSubmit() {
        //とくになにもしない
      }
    });
    add(form);
  }

  //エントリーをつくるのです
  private CompoundPropertyModel<Entity> createEntry(){
    Entity entry = new Entity();
    entry.checks.add(new ChildEntity(2008,false));
    entry.checks.add(new ChildEntity(2009,false));
    entry.checks.add(new ChildEntity(2010,false));
    return new CompoundPropertyModel<Entity>(entry);
  }

  //親
  class Entity{
    String name;
    List<ChildEntity> checks = new ArrayList<ChildEntity>();
  }

  //子
  class ChildEntity{
    ChildEntity(Integer year,Boolean check){
      this.year = year;
      this.check = check;
    }
    Integer year;
    Boolean check;
  }
}




Wicket-ja-user メーリングリストの案内
Zurück zum Archiv-Index