请考虑以下注册:
<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中.
提前感谢任何提示如何解决此问题.
我找到了.我需要为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)