我有一个ListView,从显示的一个项目开始,我将每个新项目附加一个AjaxSubmitLink,它可以正常工作。 在ListView中我有两个DropDownChoices,第一个通过AjaxFormComponentUpdatingBehavior触发第二个选择。这也适用,但仅当我将另一个项目添加到默认项目时。 如果没有单击AjaxSubmitLink,则不会更新第二个DropDownChoice,并且在Ajax调试窗口中有一个空白而不是第一个DropDownChoice的id。
这是我的代码:
final MarkupContainer devicescontainer = new WebMarkupContainer("devicesContainer");
devicescontainer.setOutputMarkupId(true);
add(devicescontainer);
final ListView devicesListView = new ListView<Device>("devices", devices) {
@Override
protected void populateItem(ListItem<Device> item) {
item.setModel(new CompoundPropertyModel<Device>(item.getModel()));
final List<Device.DeviceCategory> cats = Arrays.asList(Device.DeviceCategory.values());
final DropDownChoice<Device.DeviceCategory> categoryDropDownChoice = new DropDownChoice<Device.DeviceCategory>("deviceCategory", cats);
final DropDownChoice<Device.DeviceSubcategory> subcategoryDropDownChoice = new DropDownChoice<>("deviceSubcategory");
categoryDropDownChoice.setOutputMarkupId(true);
subcategoryDropDownChoice.setOutputMarkupId(true);
categoryDropDownChoice.add(new AjaxFormComponentUpdatingBehavior("change") {
@Override
protected void onUpdate(AjaxRequestTarget target) {
List<Device.DeviceSubcategory> subcats = Device.getPotentialSubcategories(categoryDropDownChoice.getModelObject());
subcategoryDropDownChoice.setChoices(subcats);
target.add(subcategoryDropDownChoice);
}});
item.add(categoryDropDownChoice);
item.add(subcategoryDropDownChoice);
}
}.setReuseItems(true);
devicescontainer.add(devicesListView);
AjaxSubmitLink addDeviceLink = new AjaxSubmitLink("addDevice") {
@Override
public void onSubmit(AjaxRequestTarget target, Form form) {
devicesListView.getModelObject().add(new Device(newId));
if (target != null){
target.add(devicescontainer);
}
}
};
addDeviceLink.setDefaultFormProcessing(false);
devicescontainer.add(addDeviceLink);
如何在不先单击添加设备链接的情况下使Ajax驱动的DropDownChoice工作?
编辑:所有元素的生成ID都是完整且唯一的。 ListView项目没有id,如果它们没有帮助。
答案 0 :(得分:1)
我已将您的代码发布到Wicket示例页面中,并立即生效。
请检查你的标记,这对我来说很好:
<form wicket:id="form">
<div wicket:id="devicesContainer">
<div wicket:id="devices">
<select wicket:id="deviceCategory"/>
<select wicket:id="deviceSubcategory"/>
</div>
<a wicket:id="addDevice">+</a>
</div>
</form>
答案 1 :(得分:0)
事实证明,实际上是导致问题的公司JavaScript。我相信它会调用<select>
上的select2 jquery插件,这样Ajax就会被覆盖。
我刚刚删除了整个脚本,现在一切正常。