在表单内处理ListView

Yas*_*ima 2 wicket wicket-1.5

请考虑以下注册:

<form wicket:id="form">
  <div wicket:id="fooList">                                        
    <input wicket:id="fooList.quxField" type="text" size="10"/>
  </div>                
  <button wicket:id="submit"><wicket:message key="submitText"/></button>    
</form>
Run Code Online (Sandbox Code Playgroud)

而这两个类(我假设是二传手,吸气鬼等)

class FooClazz {        
    String quxField;
}

class BarClazz {
    List<FooClazz> fooList;
}
Run Code Online (Sandbox Code Playgroud)

这个表单(模型包含在CompoundPropertyModel中):

class BarForm extends Form<BarClazz> {
  public BarForm(String id,final IModel<BarClazz> model){
    super(id,model);
    add(new ListView<FooClazz>("fooList"){
      @Override
      protected void populateItem(final ListItem<FooClazz> item){
        item.add(new TextField<String>("fooList.quxField"));
      }                   
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在上面的代码为我生成了一个运行时异常:

2011-12-11 16:33:46 ERROR [org.apache.wicket.DefaultExceptionMapper] Unexpected error occurred org.apache.wicket.WicketRuntimeException: The expression 'quxField' is neither an index nor is it a method or field for the list class java.util.ArrayList
Run Code Online (Sandbox Code Playgroud)

我可以更改TextField以包含这样的模型:

item.add(new TextField<String>("fooList.quxField", new Model<String>(model.getObject().getFooList().getQuxField())));
Run Code Online (Sandbox Code Playgroud)

这解决了错误,但是当我提交表单(使用Ajax按钮)时,我永远不会看到输入到表单字段中的值.

那么如何将TextField模型保持连接到我的表单模型呢?我忽略了明显的吗?(这当然只是我原始代码的缩短版本...)

需要添加:我的所有模型都包含在CompoundPropertyModels中.

提前感谢任何提示如何解决此问题.

Yas*_*ima 5

我找到了.我需要为TextField包含一个模型,该模型具有getObject()和setObject()的实现.所以我真的错过了显而易见的事实.

@Override
protected void populateItem(final ListItem<Taste> item) {
    final TextField<String> quxField = new TextField<String>("tastes.quxField", new Model<String>() {
        @Override
        public String getObject() {
            return item.getModel().getObject().getquxField();
        }

        @Override
        public void setObject(final String value) {
            item.getModel().getObject().setquxField(value);
        }
    });
    item.add(quxField);
}
Run Code Online (Sandbox Code Playgroud)