Wicket 1.8 DropDownChoice不';无法显示正确的模型对象
我对DropDownChoice及其模型有意见。 所涉及的HTML是一个模式窗口,用户可以通过该窗口编辑对象的设置:第一个DDC在其模型更改时更改第二个DDC的列表,并且一切正常。问题是两个DDC都不显示保存的值,但它们显示关联列表中的第一项。 下面是一些代码:Wicket 1.8 DropDownChoice不';无法显示正确的模型对象,wicket,dropdownchoice,wicket-8,Wicket,Dropdownchoice,Wicket 8,我对DropDownChoice及其模型有意见。 所涉及的HTML是一个模式窗口,用户可以通过该窗口编辑对象的设置:第一个DDC在其模型更改时更改第二个DDC的列表,并且一切正常。问题是两个DDC都不显示保存的值,但它们显示关联列表中的第一项。 下面是一些代码: private DropDownChoice<Sala> salaDDC; private DropDownChoice<Sede> sedeDDC; private ArrayList<Sala>
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);
private-DropDownChoice-salaDDC;
私人下拉选择SEDDC;
私人ArrayList listaSale;
私有Sala-Sala=null//之后,它们都得到了正确的初始化
私有Sede Sede=null;
[...]
//第一个DDC,带有“sede”列表。
//它的模型基于Sede类,它的选择列表是sediList,它是常量
form.addOrReplace(sedeDDC=新的下拉选择(“sedeDDC”,Model.of(sede),sediList);
添加(新的AjaxFormComponentUpdateBehavior(“更改”){
@凌驾
受保护的void onUpdate(AjaxRequestTarget目标){
listaSale=listSalePerSede.get(seddedc.getModelObject().getId());
if(null!=listaSale){
if(listaSale.isEmpty()){
listaSale=newarraylist();
}
}否则{
listaSale=newarraylist();
}
target.add(salaDDC);
}
});
setDefaultModelObject(sede);
setModelObject(sede);
//第二个DDC,代表“沙拉”列表
//它的模型基于Sala类,如果
//其他DDC模型对象发生了变化,因此出现了PropertyModel模型
form.addOrReplace(salaDDC=新的下拉选择(“salaDDC”,Model.of(sala),new PropertyModel(本“列表”));
setDefaultModelObject(sala);
setModelObject(sala);
salaDDC.setOutputMarkupId(true);
因此,假设您遇到这种情况:
- sede1(包含沙拉1、沙拉2、沙拉3)
- sede2(包含沙拉4、沙拉5)
我已经做了一些调试,从我收集的数据来看,模型和默认模型总是正确的:DDC只是不显示它们,我不明白为什么。如果需要更多信息,请告诉我。您使用
下拉选择
而不提供ichoicerender
,因此Wicket使用新的Choicerender()
,即没有displayExpression
和idExpression
参数
尝试使用
新的下拉选项(id、型号、列表、新的选择器(“名称”、“id”))
,其中的“名称”
将是显示表达式
和的“id”Sede
和Sala
的idExpression
您使用DropDownChoice
而不提供ichoicerender
,因此Wicket使用新的choicerender()
,即不提供displayExpression
和idExpression
参数
尝试使用新的下拉选项(id、型号、列表、新的选择器(“名称”、“id”))
,其中的“名称”
将是显示表达式
和的“id”
Sede
和Sala
的idExpression
在进一步挖掘之后,我发现了两个不同的错误引用,这两个错误应该在以前的版本中得到了解决。我不是说这个错误仍然存在,也许我仍然遗漏了一些东西,但是这个错误的解决方法在我的案例中也起到了作用
作为模型使用的类似乎存在一些问题:如果它没有实现equals()和hashcode(),它的实例将无法由后台的ChoiceRenderer正确地相互比较。因此,出于绝望,我将hashcode()和equals()都添加到Sede和Sala类中,并且效果很好
参考资料的链接:
编辑:martin_g建议也很有效,因此我将其标记为正确答案。我将保留我以前的解决方案作为建议。在进一步挖掘之后,我发现了两个不同的引用,指向一个错误,该错误在以前的版本中已解决。我不是说该错误仍然存在,也许我仍然遗漏了一些内容,但工作仍然有效在我的情况下,这个错误也起了作用 作为模型使用的类似乎存在一些问题:如果它没有实现equals()和hashcode(),它的实例将无法由后台的ChoiceRenderer正确地相互比较。因此,出于绝望,我将hashcode()和equals()都添加到Sede和Sala类中,并且效果很好 参考资料的链接:
编辑:martin_g的建议也很有效,因此我将其标记为正确答案。我将把以前的解决方案保留为建议。谢谢你的提示,也许我会稍后再尝试一下。不管怎样,我还是成功了,我会很快发布答案。我尝试了你的建议,并且成功了。再次感谢你的提示,我不明白选择者是谁这是必要的,我认为这只是为了显示的目的…在这种情况下,类已经超过了