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来说也是如此,而是对于"this"(AjaxButton(。

我是在做什么大错特错还是什么?这就是我想要做的吗?我真的很感激一些帮助。

AjaxButton中,您可以覆盖updateAjaxAttributes()并添加一个IAjaxCallListener,该在单击按钮后立即通过jQuery隐藏按钮。呈现响应页面时,按钮将再次出现。覆盖的代码如下所示:

@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 for 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 文档中

最新更新