Wicket динамический ListView - элемент по умолчанию не будет обновляться Ajax
У меня есть ListView, начиная с отображения одного элемента, где я добавляю каждый новый элемент с помощью AjaxSubmitLink, который работает нормально. Внутри ListView у меня есть два DropDownChoices, первый из которых вызывает выбор второго через AjaxFormComponentUpdatingBehavior. Это тоже работает, но только если я добавлю другой элемент к элементу по умолчанию. Если AjaxSubmitLink не щелкается, второй DropDownChoice не обновляется, и в окне отладки Ajax вместо идентификатора первого DropDownChoice есть пробел.
Вот мой код:
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);
Как заставить работать DropDownChoice с поддержкой Ajax без предварительного нажатия на ссылку "Добавить устройство"?
Редактировать: сгенерированные идентификаторы всех элементов являются полными и уникальными. У элементов ListView нет идентификаторов, и это не поможет, если они есть.
2 ответа
Оказывается, что именно корпоративный JavaScript вызвал проблему. Я считаю, что это вызывает плагин select2 jquery на <select>
S и такие Ajax переопределяются. Я только что удалил весь скрипт, и теперь все работает нормально.
Я разместил ваш код на странице примера 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>