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

时间:2019-03-14 16:04:02

标签: wicket dropdownchoice wicket-8

我在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”(没错,这是偶然的),第二个DDC显示“ sede1”和“ sala2”。 sala1”(因为它是与“ sede1”相关联的列表的第一个),而不是“ sala2”。同样,如果对象的设置为“ sede2”和“ sala5”,则DDC将分别显示“ sede1”(“ sede”列表的第一位)和“ sala4”(与“ sede2”相关联的列表的第一项)。模型对象是“ sala5”。因此,暂时来说,用户在编辑相关对象时必须为这两个字段重新设置已经保存的值,这不是很好。

我已经进行了一些调试,并且从我收集到的信息来看,模型和默认模型始终都是正确的:DDC只是不显示它们,我也不明白为什么。让我知道是否需要更多信息。

2 个答案:

答案 0 :(得分:2)

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

尝试使用new DropDownChoice(id, model, list, new ChoiceRenderer("name", "id")),其中"name"是{{1}和displayExpression的{​​{1}}和"id"

答案 1 :(得分:0)

经过进一步的挖掘,我找到了两个不同的引用,这些引用据说是在先前版本中已解决的。我并不是说该错误仍然存​​在,也许我仍然错过了一些东西,但是该错误的变通方法也适用于我。

似乎该类用作模型存在一些问题:如果未实现equals()和hashcode(),则ChoiceRenderer在后台无法正确比较其实例。因此,我只是出于绝望而将hashcode()和equals()都添加到Sede和Sala类中,并且效果很好。

链接到参考文献:

编辑:martin_g建议也可以正常工作,因此我将其标记为正确答案。我将保留以前的解决方案作为建议。