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

Другие вопросы по тегам