我有一个使用Wicket的Web应用程序。我的问题如下: 我有一部分代码在AjaxRequestTarget中运行,花费很长时间,我有必要在此操作期间显示一个忙指示符,以便向用户显示我们正在尝试处理请求。
我尝试使用target.appendJavascript(" jsfunction()")但它不起作用,因为它在执行该方法后被触发。我怎样才能实现这个目标?
我的示例代码如下
final ConfirmModal del_modal = new ConfirmModal("del-btn", "Are you sure?") {
@Override
public void onClickOK(AjaxRequestTarget target) {
target.appendJavaScript("loadingFormFromTarget();");
try {
Thread.sleep(10000);
} catch (InterruptedException ex) {
Logger.getLogger(ListPricePlanPage.class.getName()).log(Level.SEVERE, null, ex);
}}}
更新
martin-g提供的解决方案适用于AjaxLink,但我的问题更复杂。我有一个使用此实现扩展ModalWindo的ConfirmModal public abstract class ConfirmModalPanel扩展了Panel {
public ConfirmModalPanel(String id, String text) {
super(id);
add(new Label("text", text));
AjaxLink ok = new AjaxLink("ok") {
@Override
public void onClick(AjaxRequestTarget target) {
onClikOK(target);
}
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
attributes.getAjaxCallListeners().add(new AjaxCallListener().onBeforeSend("start();").onComplete("finish();"));
}
};
add(ok);
add(new AjaxLink("ko") {
@Override
public void onClick(AjaxRequestTarget target
) {
onClikKO(target);
}
}
);
}
abstract public void onClikOK(AjaxRequestTarget target);
abstract public void onClikKO(AjaxRequestTarget target
);
}
功能" start()"和"完成()"被正确调用,但是onClickOK方法内的请求写入的执行继续,我无法显示忙指示符。
答案 0 :(得分:1)
在onClickOk()
中执行此操作为时已晚。一旦请求完成,写入Web响应的任何内容都将发送到浏览器。
您需要使用AjaxCallListener#onBeforeSend()
和onComplete()
。这些是在发出请求之前和收到回复之后在客户端执行的。
有关示例,请参阅https://github.com/l0rdn1kk0n/wicket-bootstrap/blob/73a3d62a17c12cbca60d6b54caeee6b99ffbe9a8/bootstrap-extensions/src/main/java/de/agilecoders/wicket/extensions/markup/html/bootstrap/ladda/LaddaAjaxLink.java#L101和https://github.com/l0rdn1kk0n/wicket-bootstrap/blob/73a3d62a17c12cbca60d6b54caeee6b99ffbe9a8/bootstrap-extensions/src/main/java/de/agilecoders/wicket/extensions/markup/html/bootstrap/ladda/LaddaAjaxCallListener.java#L15-L16。