Wicket - 在延迟加载期间隐藏AjaxButton上的元素

时间:2013-07-25 08:00:57

标签: java ajax web-applications wicket wicket-1.5

我有一个AjaxLazyLoadPanel页面,它包含一个长加载列表并提交AjaxButton。

在AjaxLazyLoadPanel准备就绪后,当我提交时,另一个长时间加载正在执行,之后我需要刷新整个页面。这是我自己的地方,代码如下:

    AjaxButton button1 = new AjaxButton("submit1") {
        @Override
        protected void onSubmit(AjaxRequestTarget target, Form form) {
            someLongWorkingMethod();
            setResponsePage(page); //refreshing page
        }
    };
    add(button1);

它完美无缺。但是我现在要做的是 - 在方法计算时禁用此按钮或隐藏此按钮(或整个面板,如果必要),并且当使用setResponsePage刷新页面时我想要使用此按钮

我已经阅读了很多关于它的帖子/邮件列表,但没有任何帮助我,我尝试了所有我找到的东西并把它放在了一些LongWorkingMethod()之前:

ajaxLazyLoadPanel.setOutputMarkupId(true);
ajaxLazyLoadPanel.setOutputMarkupPlaceholderTag(true);
ajaxLazyLoadPanel.add(new AttributeAppender("style","display:none;"));
ajaxLazyLoadPanel.setVisible(false);
ajaxLazyLoadPanel.setEnabled(false);
target.add(ajaxLazyLoadPanel);

同样不适用于ajaxLazyLoadPanel,但适用于“this”(AjaxButton)。

我做的事情是非常错误还是什么?这是我正在努力做到的事情吗?我真的很感激一些帮助。

2 个答案:

答案 0 :(得分:1)

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 "";
        }
    });
}

答案 1 :(得分:1)

感谢@Robert Niestroj的回答(但只在最新的Wicket 6中工作),我找到了Wicket 1.5的解决方案,我希望它能帮助别人。

它的想法很相似,但是通过覆盖AjaxButton的getAjaxCallDecorator并使用纯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;
            }
        };
    }
};

要记住的重要事项是确保您返回脚本+ [添加的脚本],否则您的onsubmit操作将不会发生。

Wicket 1.5 doc

中的更多信息(以及onSucces和onFailure版本)