2013-03-05 64 views
1

我有这种情况:检票口阿贾克斯指示器

我有一个IndicatingAjaxButton。在onSubmit方法中,一些操作完成,然后setResponsePage(otherPage);被称为

虽然操作仍在进行中,但繁忙指示符仍可见。但是当操作完成后,当用户仍在同一页面上时,指示器消失,能够进行其他活动,而浏览器正忙于打开其他页面。

我的问题是如何使指示灯仍然可见,只要浏览器正忙打开otherPage.

谢谢

+0

我不太明白,但是无论控制器状态如何,您都可以使用JS显示指示器 – osdamv 2013-03-05 22:53:01

回答

1

首先,你需要确保你真正需要做的这在一个ajax请求。我不认为这是必要的,除非你只根据特定条件执行setResponsePage(),否则执行一些Ajaxy操作。

如果你不需要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; 
} 

这里检票正在准备的JavaScript wicketHide(id)呼叫,这将有效地隐藏所述指示器一旦请求完成(以及在sucess或失败)。

我从来没有尝试这样做,但可能覆盖getFailureScript()getSuccessScript(),执行wicketHide(id),在阿贾克斯的行为应该做的伎俩之前使脚本return

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的来源(至少对我来说)非常清楚地阅读和理解。他们可以帮助您了解它是如何工作的,以及如何调整它以适应您的需求。

+0

谢谢您的回答。我不知道这个解决方案是否适用于我,因为唯一出现这种情况的错误是指示符在页面仍然忙于打开其他页面时不可见。所以我不知道getSuccessScript()和getFailureScript()如何帮助我。我需要的是让浏览器忙于打开另一页时让指示灯亮起。 – mnish 2013-03-08 08:20:22

+0

在执行'wicketHide(id)'之前,重写'getFailureScript()'和'getSucessScript()'使javascript'return'有助于避免隐藏指示器。如果指示器没有隐藏,它将一直保持到下一页加载。但是,如果您只想在离开页面时显示指示符,那么您可以在''上添加一个JavaScript'onunload'事件处理程序,然后显示该指示符。 – 2013-03-08 08:25:59