我正在使用GWTP来构建我的Web应用程序。这是我的问题。我有一个客户页面(客户演示者)。当访问该页面时,它将调用并加载数据库中的数据。
加载所有数据可能需要一段时间,因此我希望锁定我当前的浏览器,以便用户在数据尚未完成下载时无法单击任何内容。
这就是我的想法。我想在进行 RPC 调用之前显示一个对话框,并在调用完成时隐藏它。看看下面的代码:
public class CustPresenter extends
Presenter<CustPresenter.MyView, CustPresenter.MyProxy> {
private DialogBox loadingDialogBox=new DialogBox();
@Inject DispatchAsync dispatchAsync;
@Override
public void prepareFromRequest(PlaceRequest request){
super.prepareFromRequest(request);
loadingDialogBox.show();
GetData getDataAction=new GetData();
dispatchAsync.execute(getDataAction, getDataCallback);
}
private AsyncCallback<GetDataResult> getDataCallback=new AsyncCallback<GetDataResult>(){
@Override
public void onFailure(Throwable caught) {
loadingDialogBox.hide();
}
@Override
public void onSuccess(GetVerbFromTripleResult result) {
//show data here (it may take long time)
loadingDialogBox.hide();
}
};
}
但是,在运行时,对话框仅显示 1 秒,然后消失。之后,所有UiBinder Guis都会显示在客户页面上,用户可以在数据尚未完成下载时单击页面上的任何按钮。这不是正确的行为。
我想 http://sqlfiddle.com/#!2/a2581/1 做这样的事情。如您所见,当您第一次打开该链接时,会弹出一个加载面板,在所有 gui 出现之前,您无法单击任何内容。
我也尝试进行自定义异步回调,但没有任何反应
public abstract class AsyncCall<T> implements AsyncCallback<T> {
PopupPanel myp=new PopupPanel();
/** Call the service method using cb as the callback. */
public AsyncCall()
{
myp.setTitle("loading");
myp.show();
}
public final void onFailure(Throwable caught)
{
myp.hide();
onCustomFailure(caught);
}
public final void onSuccess(T result)
{
myp.hide();
onCustomSuccess(result);
}
/** the failure method needed to be overwritte */
protected abstract void onCustomFailure(Throwable caught);
/** overwritte to do something with result */
protected abstract void onCustomSuccess(T result);
}
那么,为什么我有这个问题?
如何解决?
或者一般来说,在 GWTP 中的 RPC 调用期间显示"加载指示器"的最简单方法是什么?
我找到了一个很酷的解决方案,那就是我们必须将WidgetPresenter与PopupPanel一起使用(例如LoadPresenter)。所以在我的自定义异步调用类中,我需要火加载演示器
public abstract class AsyncCall<T> implements AsyncCallback<T> {
/** Call the service method using cb as the callback. */
public AsyncCall()
{
Utility.eventBus.fireEvent(new ShowLoadingEvent(true));
}
public final void onFailure(Throwable caught)
{
//myp.hide();
Utility.eventBus.fireEvent(new ShowLoadingEvent(false));
onCustomFailure(caught);
}
public final void onSuccess(T result)
{
//myp.hide();
Utility.eventBus.fireEvent(new ShowLoadingEvent(false));
onCustomSuccess(result);
}
/** the failure method needed to be overwritte */
protected abstract void onCustomFailure(Throwable caught);
/** overwritte to do something with result */
protected abstract void onCustomSuccess(T result);
}
要进行 RPC 调用,只需使用以下命令:
private AsyncCall<GetDataResult> getDataCallback=new AsyncCall<GetDataResult>(){
@Override
public void onCustomFailure(Throwable caught) {
}
@Override
public void onCustomSuccess(GetVerbFromTripleResult result) {
//show data here (it may take long time)
}
};
然后它运行得非常顺利。