Не удается отправить при выпадающей отложенной загрузке

#wicket

#калитка

Вопрос:

В моей форме есть 1 выпадающий список с использованием AjaxLazyLoadPanel и 1 кнопка отправки ajax.
Я нажимаю кнопку отправки, которая работает только после завершения загрузки выпадающего списка.

Index.java

 form.add(new AjaxLazyLoadPanel("lazy") {
        
    private static final long serialVersionUID = 1L;

    @Override
    public Component getLazyLoadComponent(String markupId) {
        Fragment fr = new Fragment(markupId, "lazyContentFragment", Index.this);
        fr.add(dropdown());
        return fr;
    }
});
form.setOutputMarkupId(true);

form.add(new AjaxButton("search") {
    @Override
    protected void onError(AjaxRequestTarget target) {
        target.add(feedback);
    }

    @Override
    protected void onSubmit(AjaxRequestTarget target) {
        //do something...
    }
});
 

Index.html

 <form wicket:id="form">
    <input wicket:id="textbox"/>
    <div wicket:id="lazy"></div>
    <button wicket:id="search"></button>
</form>

<wicket:fragment wicket:id="lazyContentFragment">
    <select wicket:id="dropdown"></select>
</wicket:fragment>
 

Есть ли какой-либо способ отправить форму, не дожидаясь завершения загрузки выпадающего списка.

Ответ №1:

По умолчанию wicket-ajax.js сериализует вызовы Ajax на сервер. Это делается для того, чтобы второй вызов Ajax не вызывался, если его HTML-элемент удаляется / окрашивается первым вызовом Ajax.

Кроме того, только один поток может одновременно управлять экземпляром страницы на стороне сервера!

Чтобы иметь возможность выполнять два вызова Ajax одновременно, вам нужно использовать AjaxChannel для них разные s. Например:

 ... = new AjaxButton("someId") {
  @Override protected void updateAjaxAttributes(AjaxRequestAttributes attributes)
   {
      attributes.setChannel(new AjaxChannel("customName"));
   }
}
 

Таким образом, оба Ajax-запроса будут отправлены на сервер, но AjaxButton будет обработан только после того, как AjaxLazyLoadingPanel снимет блокировку экземпляра страницы на стороне сервера. Невозможно выполнить два потока на одном экземпляре страницы (т. Е. С одинаковым идентификатором страницы).

Ответ №2:

Если ваши варианты из выпадающего списка загружаются так долго, вы можете сделать свою AjaxLazyLoadPanel асинхронной, переопределив #isContentReady():

 private String token;
private List<T> choices;

protected boolean isContentReady()
{
    if (token == null) {
        token = startLoadingChoices();
    } else {
        choices = checkChoicesLoaded(token);
    }

    return choices != null;
}
 

Поскольку Wicket управляет и сериализует все страницы, ваша страница не должна храниться в качестве ссылки в потоке или прослушивателе в центральном реестре. Вместо этого сохраните токен и запросите результат загрузки; #isContentReady() будет опрашиваться повторно, пока не вернет true .

Комментарии:

1. Спасибо @svenmeier, это работает, первый щелчок отправки работает, но вторая отправка должна ждать завершения загрузки выпадающего списка. Можете ли вы помочь мне обработать 2-ю отправку