我遇到了 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”的对象,则对话框窗口将加载第一个显示“sede1”的 DDC(这是正确的,只是偶然),第二个显示“sala1”(因为是与“sede1”关联的列表的第一个),而不是“sala2”。同样,如果对象的设置是“sede2”和“sala5”,则 DDC 将分别显示“sede1”(“sede”列表的第一个)和“sala4”(与“sede2”关联的列表的第一个项目),而模型对象是“sala5”。因此,目前,用户在编辑相关对象时必须重新设置这两个字段的已保存值,这并不好。
我做了一些调试,从我收集的信息来看,模型和默认模型总是正确的:DDC 只是不显示它们,我不明白为什么。如果需要更多信息,请告诉我。