Java Wicket-更新PropertyModel时表单组件失去引用
我有一个带有一些字段和下拉选项的表单。其中一个是动态填充的:当状态被填充时,城市下拉列表被更新,在这里之前都是可以的 动态填充下拉列表(我使用hibernate作为ORM):Java Wicket-更新PropertyModel时表单组件失去引用,java,forms,hibernate,wicket,dropdownchoice,Java,Forms,Hibernate,Wicket,Dropdownchoice,我有一个带有一些字段和下拉选项的表单。其中一个是动态填充的:当状态被填充时,城市下拉列表被更新,在这里之前都是可以的 动态填充下拉列表(我使用hibernate作为ORM): 那个小门能用吗?如果组件的属性模型引用接收到新对象,组件将丢失其引用,需要显式重置?使用新属性模型(form.getModel(),“umf.state”)更改新属性模型(umf,“state”)。同样适用于城市 您面临的问题是,一旦将umf传递到PropertyModel中,它就会作为自己的成员字段保存在其中。稍后更改表
那个小门能用吗?如果组件的属性模型引用接收到新对象,组件将丢失其引用,需要显式重置?使用
新属性模型(form.getModel(),“umf.state”)
更改新属性模型(umf,“state”)
。同样适用于城市
您面临的问题是,一旦将umf
传递到PropertyModel
中,它就会作为自己的成员字段保存在其中。稍后更改表单中的引用,但PropertyModel仍然指向其成员字段,即旧字段
通过传递表单的模型,它变得动态-每当PropertyModel需要状态时,它都会向表单的模型请求modelObject。使用
新属性模型(form.getModel(),“umf.state”)
更改新属性模型(form.getModel(),“umf.state”)
。同样适用于城市
您面临的问题是,一旦将umf
传递到PropertyModel
中,它就会作为自己的成员字段保存在其中。稍后更改表单中的引用,但PropertyModel仍然指向其成员字段,即旧字段
通过传递表单的模型,它将变得动态—每当PropertyModel需要状态时,它都会向表单的模型询问modelObject。找到了解决方案。我开始以以下形式使用CompoundPropertyModel:
umf = new Umf();
CompoundPropertyModel model = new CompoundPropertyModel(umf);
setDefaultModel(model);
然后组件模型引用它:
nameModel = new RequiredTextField("name", model.bind("name"));
DropDownChoice statesChoice = new DropDownChoice<State>(
"states",
new PropertyModel(getModel(), "state"),
em.createQuery("from Estado e").getResultList(),
new ChoiceRenderer<State>("name")
);
// and so on
这样组件就不会丢失表单的引用。找到了解决方案。我开始以以下形式使用CompoundPropertyModel:
umf = new Umf();
CompoundPropertyModel model = new CompoundPropertyModel(umf);
setDefaultModel(model);
然后组件模型引用它:
nameModel = new RequiredTextField("name", model.bind("name"));
DropDownChoice statesChoice = new DropDownChoice<State>(
"states",
new PropertyModel(getModel(), "state"),
em.createQuery("from Estado e").getResultList(),
new ChoiceRenderer<State>("name")
);
// and so on
这样,组件就不会丢失表单的引用。感谢您的澄清,通过您的回答,我找到了一个解决方案,但由于您是Wicket团队的成员,我有一些问题:-onSubmit方法我正在运行
clearInput()
,但它不起作用,只有在表单验证失败时。。为什么使用CompoundPropertyModel是否总是好的使用它,有必要保留简单的组件引用(如TextFields),或者我可以简单地通过add添加它们(newtextfield(“name”,model.bind(“name”)
,跳过TextField声明?提前感谢:)感谢您的澄清,通过您的回答,我找到了一个解决方案,但由于您在Wicket团队中,我有一些问题:-onSubmit方法我正在运行clearInput()
,但它不起作用,只有在表单验证失败时才起作用..为什么?-使用CompoundPropertyModel总是很好的?-使用它,有必要保持简单组件的引用(比如TextField)或者我可以简单地添加它们,只需执行add(newtextfield(“name”,model.bind(“name”)
,跳过TextField声明?提前感谢:)
umf = new Umf();