Wicket 1.8 DropDownChoice未显示正确的模型对象

问题描述 投票:0回答:2

我遇到DropDownChoice及其模型的问题。涉及的HTML是一个模态窗口,用户可以使用该窗口编辑对象的设置:第一个DDC在其模型更改时更改第二个DDC的列表,一切正常。问题是两个DDC都没有显示保存的值,但它们显示列表中的第一个项目。这是一些代码:

private DropDownChoice<Sala> salaDDC;
private DropDownChoice<Sede> sedeDDC;
private ArrayList<Sala> listaSale;

private Sala sala = null; //they both get correctly initialized afterwards
private Sede sede = null;
[...]
//first DDC, with the "sede" list. 
//Its model is based on class Sede, and its list of choices is sediList, which is constant

    form.addOrReplace(sedeDDC = new DropDownChoice<>("sedeDDC", Model.of(sede), sediList);
    sedeDDC.add(new AjaxFormComponentUpdatingBehavior("change") {
        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            listaSale = listSalePerSede.get(sedeDDC.getModelObject().getId());
            if (null != listaSale) {
                if (listaSale.isEmpty()) {
                    listaSale = new ArrayList<>();
                }
            } else {
                listaSale = new ArrayList<>();
            }
            target.add(salaDDC);
        }
    });
    sedeDDC.setDefaultModelObject(sede);
    sedeDDC.setModelObject(sede);

//second DDC, representing the "sala" list 
//Its model is based on Sala class, and its list of choices changes if the 
//other DDC model object changes, hence the PropertyModel model

    form.addOrReplace(salaDDC = new DropDownChoice<>("salaDDC", Model.of(sala), new PropertyModel(this, "listaSale")));
    salaDDC.setDefaultModelObject(sala);
    salaDDC.setModelObject(sala);
    salaDDC.setOutputMarkupId(true);

所以,假设你有这种情况:

  • sede1(包含sala1,sala2,sala3)
  • sede2(包含sala4,sala5)

“Sede”有一个像部门的意思,“Sala”就像一个房间,所以对于每个部门,你可以有一个不同房间的列表。

如果用户尝试编辑设置为“sede1”和“sala2”的对象,则对话窗口将加载第一个DDC显示“sede1”(这是正确的,只是偶然),第二个显示“sala1”(因为是与“sede1”相关联的列表中的第一个,而不是“sala2”。类似地,如果对象的设置是“sede2”和“sala5”,则DDC将分别显示“sede1”(第一个“sede”列表)和“sala4”(与“sede2”相关联的列表的第一项),而模型对象是“sala5”。因此,目前,用户在编辑相关对象时必须重新设置这两个字段已保存的值,这样做并不好。

我做了一些调试,从我收集的内容来看,模型和默认模型都是正确的:DDC只是不显示它们,我无法理解为什么。如果需要更多信息,请与我们联系。

wicket dropdownchoice wicket-8
2个回答
2
投票

你使用DropDownChoice而不提供IChoiceRenderer,因此Wicket使用new ChoiceRenderer(),即没有displayExpressionidExpression参数。

试试new DropDownChoice(id, model, list, new ChoiceRenderer("name", "id")),其中"name"将是displayExpression"id" idExpressionSedeSala


0
投票

在进行了一些挖掘之后,我发现了两个不同的引用,这个引用可以在以前的版本中解决。我并不是说bug仍然存在,也许我仍然遗漏了一些东西,但是这个bug的解决方法也适用于我的情况。

似乎用作模型的类存在一些问题:如果它没有实现equals()和hashcode(),那么它的实例将不会被后台的ChoiceRenderer正确地相互比较。因此,我将hashcode()和equals()添加到Sede和Sala类中,只是出于绝望,它运行良好。

参考链接:

编辑:martin_g建议工作正常,所以我把它标记为正确的答案。我将把我以前的解决方案作为建议。

© www.soinside.com 2019 - 2024. All rights reserved.