wicket ajax indicator



我有这样的情况:

有一个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()实现中,通过AjaxRequestTargetreturn有条件地定义一个js变量。

Wicket的来源(至少对我来说)非常清晰,易于阅读和理解。他们可以帮助你了解它是如何工作的,以及如何调整它以满足你的需求。

最新更新