GWTP を使用して webapp を構築しています。これが私の問題です。私は顧客ページ (CustPresenter) を持っています。そのページにアクセスすると、データベースからデータを呼び出してロードします。
すべてのデータをロードするには時間がかかる場合があるため、現在のブラウザをロックして、データのダウンロードがまだ完了していない間はユーザーが何もクリックできないようにします。
だからここに私が考えていることがあります。RPC 呼び出しを行う直前に DialogBox を表示し、呼び出しが終了したら非表示にしたいと考えています。以下のコードを見てください。
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 が表示されるまで何もクリックできません。
カスタム AsyncCallback も作成しようとしましたが、何も起こりませんでした
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 呼び出し中に「読み込みインジケーター」を表示する最も簡単な方法は何ですか?