0

我有一个带有 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 和“this”(AjaxButton)也是如此。

我是在做一些非常错误的事情还是什么?这是我想要做的甚至可能吗?我真的很感激一些帮助。

4

2 回答 2

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 "";
        }
    });
}
于 2013-07-25T23:00:54.493 回答
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 文档中的更多信息(以及 onSucces 和 onFailure 版本)

于 2013-07-26T07:58:13.607 回答