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

Wicket 1.8 DropDownChoice doesn't show the correct model object

我对 DropDownChoice 及其模型有疑问。 所涉及的 HTML 是一个模态 window ,用户可以使用它来编辑对象的设置:第一个 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);

所以,假设您遇到这种情况:

"Sede" 有部门的含义,而 "Sala" 就像一个房间,所以对于每个部门,你可以有一个不同房间的列表。

如果用户尝试编辑设置为 "sede1" 和 "sala2" 的对象,对话框 window 将加载显示 "sede1" 的第一个 DDC(即对,只是偶然),第二个显示 "sala1"(因为列表中的第一个与 "sede1" 关联),而不是 "sala2"。同样,如果对象的设置是 "sede2" 和 "sala5",DDC 将分别显示 "sede1"("sede" 列表的第一项)和 "sala4"(第一项与 "sede2" 关联的列表),而模型对象是 "sala5"。所以,暂时,用户在编辑相关对象时必须重新设置这两个字段已经保存的值,这是不好的。

我进行了一些调试,从我收集的信息来看,模型和默认模型总是正确的:DDC 只是不显示它们,我不明白为什么。如果需要更多信息,请告诉我。

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

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

经过更多的挖掘,我发现了两个不同的错误参考,据称在以前的版本中已解决。我并不是说错误仍然存​​在,也许我仍然遗漏了一些东西,但该错误的解决方法也适用于我的情况。

用作模型的 class 似乎存在一些问题:如果它没有实现 equals() 和 hashcode(),它的实例将不会被 ChoiceRenderer 正确地相互比较背景。因此,出于绝望,我将 hashcode() 和 equals() 添加到 Sede 和 Sala classes,并且效果很好。

参考链接:

编辑:martin_g 建议也很有效,所以我将其标记为正确答案。我将保留我之前的解决方案作为建议。