Wicket - 更新 PropertyModel 时表单组件丢失引用
Wicket - form components losing reference when PropertyModel is updated
我有一个包含一些字段和 DropdownChoices 的表单。其中之一是动态填充:当州被填充时,城市下拉列表会更新,直到这里都可以。
动态填充的下拉菜单(我使用 hibernate 作为 ORM):
// in my form constructor
// umf is my model
umf = new Umf();
DropDownChoice stateChoice = new DropDownChoice<State>(
"states",
new PropertyModel(umf, "state"),
em.createQuery("from State e").getResultList(),
new ChoiceRenderer<State>("name")
);
DropDownChoice citiesChoice = new DropDownChoice<City>(
"cities",
new PropertyModel(umf, "city"),
new ArrayList<City>(),
new ChoiceRenderer<>("name")
);
当我尝试清除表单和我的模型以使表单为其他提交做好准备时,第一次提交表单后(正常发生)出现问题。
第一个问题在 onSubmit 方法中,在将对象持久化到数据库后,我为我的模型设置了一个新对象:umf = new Umf();
以便准备持久化一个新的umf。在此之后,组件似乎丢失了 umf 引用。
定义下拉状态模型的行:new PropertyModel(umf, "state")
不再起作用,因为即使我在下拉列表中更改状态,umf.state
PropertyModel 也不会更新(始终为 0),因此城市下拉列表不会已满
// right after statesChoice and citiesChoice declaration
statesChoice.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
citiesChoice.setChoices(
em.createQuery("from City m where m.state.id = :state_id")
.setParameter("state_id", umf.getState().getId())
.getResultList()
);
target.add(cititesChoice);
}
});
Wicket 是这样的吗?如果组件的 属性 模型引用接收到一个新对象,组件将失去它的引用并需要显式重置?
将 new PropertyModel(umf, "state")
更改为 new PropertyModel(form.getModel(), "umf.state")
。 city
.
相同
您面临的问题是,一旦您将 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
提交后(onSubmit方法):
umf = new Umf();
这样组件就不会丢失表单的引用。
我有一个包含一些字段和 DropdownChoices 的表单。其中之一是动态填充:当州被填充时,城市下拉列表会更新,直到这里都可以。
动态填充的下拉菜单(我使用 hibernate 作为 ORM):
// in my form constructor
// umf is my model
umf = new Umf();
DropDownChoice stateChoice = new DropDownChoice<State>(
"states",
new PropertyModel(umf, "state"),
em.createQuery("from State e").getResultList(),
new ChoiceRenderer<State>("name")
);
DropDownChoice citiesChoice = new DropDownChoice<City>(
"cities",
new PropertyModel(umf, "city"),
new ArrayList<City>(),
new ChoiceRenderer<>("name")
);
当我尝试清除表单和我的模型以使表单为其他提交做好准备时,第一次提交表单后(正常发生)出现问题。
第一个问题在 onSubmit 方法中,在将对象持久化到数据库后,我为我的模型设置了一个新对象:umf = new Umf();
以便准备持久化一个新的umf。在此之后,组件似乎丢失了 umf 引用。
定义下拉状态模型的行:new PropertyModel(umf, "state")
不再起作用,因为即使我在下拉列表中更改状态,umf.state
PropertyModel 也不会更新(始终为 0),因此城市下拉列表不会已满
// right after statesChoice and citiesChoice declaration
statesChoice.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
citiesChoice.setChoices(
em.createQuery("from City m where m.state.id = :state_id")
.setParameter("state_id", umf.getState().getId())
.getResultList()
);
target.add(cititesChoice);
}
});
Wicket 是这样的吗?如果组件的 属性 模型引用接收到一个新对象,组件将失去它的引用并需要显式重置?
将 new PropertyModel(umf, "state")
更改为 new PropertyModel(form.getModel(), "umf.state")
。 city
.
您面临的问题是,一旦您将 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
提交后(onSubmit方法):
umf = new Umf();
这样组件就不会丢失表单的引用。