Wicket динамический ListView - элемент по умолчанию не будет обновляться Ajax - PullRequest
0 голосов
/ 07 июня 2018

У меня есть 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 ]

0 голосов
/ 14 июня 2018

Оказывается, что именно корпоративный JavaScript вызвал проблему.Я считаю, что он вызывает плагин select2 jquery на <select> s, и такой Ajax переопределяется.Я только что удалил весь скрипт, и теперь все работает нормально.

0 голосов
/ 08 июня 2018

Я разместил ваш код на странице примера 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>
...