我有一个包含一些字段和DropdownChoices的表单。其中之一是动态填充的:当州被填充时,城市下拉列表将更新,在这里还可以。

下拉列表动态填充(我将休眠用作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,它将被保存在其内部作为其成员字段。稍后,您可以在Form中更改引用,但PropertyModel仍指向其成员字段,即旧的成员字段。

通过传递表单的模型,它变成动态的-每当PropertyModel需要状态时,它都会向表单的模型询问其modelObject。

10-06 07:27