我有一个带有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 文档中