Wicket - скрыть элемент на AjaxButton во время отложенной загрузки
У меня есть страница с AjaxLazyLoadPanel, которая содержит список с длительной загрузкой и отправку AjaxButton.
После того, как AjaxLazyLoadPanel готов, когда я отправляю, выполняется другая долгая загрузка, и после этого мне нужно обновить всю страницу. Вот где я получаю себя, код выглядит следующим образом:
AjaxButton button1 = new AjaxButton("submit1") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form form) {
someLongWorkingMethod();
setResponsePage(page); //refreshing page
}
};
add(button1);
И это работает отлично. Но то, что я сейчас пытаюсь сделать - это отключить эту кнопку или скрыть эту кнопку (или всю панель, если это необходимо), когда метод вычисляется, и когда страница обновляется с помощью setResponsePage, я хотел бы вернуть эту кнопку назад,
Я прочитал много постов / списков рассылки об этом, но ничего не помогло мне, я перепробовал все, что нашел, и поместил его перед someLongWorkingMethod():
ajaxLazyLoadPanel.setOutputMarkupId(true);
ajaxLazyLoadPanel.setOutputMarkupPlaceholderTag(true);
ajaxLazyLoadPanel.add(new AttributeAppender("style","display:none;"));
ajaxLazyLoadPanel.setVisible(false);
ajaxLazyLoadPanel.setEnabled(false);
target.add(ajaxLazyLoadPanel);
И то же самое не для ajaxLazyLoadPanel, но для "этого" (AjaxButton).
Я делаю что-то ужасно неправильно или как? Это то, что я пытаюсь сделать, даже возможно? Я был бы очень признателен за помощь.
2 ответа
В вашем AjaxButton
вы могли бы переопределить updateAjaxAttributes()
и добавить IAjaxCallListener
который скрывает кнопку через jQuery сразу после нажатия кнопки. Когда рендеринг responsePage отображается, кнопка появляется снова. Код для переопределения выглядит так:
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
attributes.getAjaxCallListeners().add(new IAjaxCallListener() {
@Override
public CharSequence getBeforeHandler(Component cmpnt) {
return "$(\"#" + cmpnt.getMarkupId() + "\").hide()";
}
@Override
public CharSequence getPrecondition(Component cmpnt) {
return "";
}
@Override
public CharSequence getBeforeSendHandler(Component cmpnt) {
return "";
}
@Override
public CharSequence getAfterHandler(Component cmpnt) {
return "";
}
@Override
public CharSequence getSuccessHandler(Component cmpnt) {
return "";
}
@Override
public CharSequence getFailureHandler(Component cmpnt) {
return "";
}
@Override
public CharSequence getCompleteHandler(Component cmpnt) {
return "";
}
});
}
Благодаря ответу @Robert Niestroj (но работающему только в новейшей Wicket 6) я нашел решение для Wicket 1.5, надеюсь, оно кому-нибудь поможет.
Это просто похожая идея, но достигается с помощью переопределения getAjaxCallDecorator для AjaxButton и использования чистого Javascript
AjaxButton button1 = new AjaxButton("submit1") {
String id = this.getMarkupId();
@Override
protected void onSubmit(AjaxRequestTarget target, Form form) {
...
}
@Override
protected org.apache.wicket.ajax.IAjaxCallDecorator getAjaxCallDecorator() {
return new AjaxCallDecorator() {
@Override
public CharSequence decorateScript(Component component, CharSequence script) {
return "document.getElementById(\'"+id+"\').style.display = 'none';"+script;
}
};
}
};
Важно помнить, что вы возвращаете script+[добавленный скрипт], потому что в противном случае ваше действие onsubmit не произойдет.
Дополнительная информация (а также версии onSucces и onFailure) в Wicket 1.5 doc