我有这样的情况:
有一个IndicatingAjaxButton
。在onSubmit
方法中完成了一些操作,然后setResponsePage(otherPage);
被称为
当操作仍在进行时,繁忙指示符可见。但是,当操作完成后,当用户仍然在同一页面上,能够进行其他活动时,指示器消失了,而浏览器正忙着打开另一个页面。
我的问题是如何使指标仍然可见,只要浏览器正忙着打开otherPage.
谢谢
首先,您需要确保在ajax请求中确实需要这样做。我不认为这是必要的,除非你只根据某些条件执行setResponsePage()
,否则执行一些ajax操作。
如果您不需要Ajax,我建议放弃它,只发送常规请求。你可以编写一个繁忙的指示器客户端或Wicket端,并使其显示与javascript(可能在body.onunload
一般的方式?)。
但是,如果你真的想做到这一点,你应该明白为什么指示器被隐藏。Wicket准备在调用完成(成功或失败)时执行的javascript。相关方法为AbstractDefaultAjaxBehavior#generateCallbackScript()
:
final CharSequence onSuccessScript = getSuccessScript();
final CharSequence onFailureScript = getFailureScript();
...
if (!Strings.isEmpty(indicatorId))
{
String hide = ";wicketHide('" + indicatorId + "');";
success = success + hide;
failure = failure + hide;
}
这里Wicket正在准备javascript wicketHide(id)
调用,一旦请求完成(无论成功还是失败),该调用将有效地隐藏指示器。
我从来没有尝试过这样做,但可能重写getFailureScript()
和getSuccessScript()
,使脚本return
之前执行wicketHide(id)
,在您的Ajax行为应该做的伎俩:
protected CharSequence getSuccessScript() {
String script = super.getSucessScript();
return (script != null ? script : "") + ";return false;";
}
protected CharSequence getFailureScript() {
String script = super.getFailureScript();
return (script != null ? script : "") + ";return false;";
}
注意,这将始终显示指示符,而不会隐藏它。如果你想根据setResponsePage
是否完成来有条件地隐藏它,你可以,例如,在你的getSucessScript()
和getFailureScript()
实现中,通过AjaxRequestTarget
和return
有条件地定义一个js变量。
Wicket的来源(至少对我来说)非常清晰,易于阅读和理解。他们可以帮助你了解它是如何工作的,以及如何调整它以满足你的需求。