3

GWT 非同期 RPC 呼び出しの「読み込み中」アイコンの管理を一元化するにはどうすればよいですか? すべての非同期呼び出しで自動的にタイマーを開始する方法を探しています。タイマーが起動したときに RPC がまだ完了していない場合は、「読み込み中」アイコンが表示されます。RPC が完了すると ( または のいずれonSuccess()onFailure())、ロード アイコンが削除されます。

これを呼び出しごとに手動で行うのは面倒であり、実際には非常に簡単に間違えて、UI が動かなくなってしまいます。

これにジェネレーターを使用できますか?明確にするために、ダイアログやアイコンを表示するコードを探しているわけではありません。このようなダイアログ/アイコンの管理を一元化する方法を探しています。

4

3 に答える 3

4

たぶんもっと単純な方法でそれを見ています。しかし、私たちのアプリケーションには同様の動作があり、デコレーター パターンを使用して実装するだけです。デコレーターはロード中の UI を表示するように処理し (この場合はすぐに表示されます)、返されたときに UI が再び削除されるようにします。

呼び出しは次のようになります。

rpc.dosomething( params, Modality.appModal( new AsyncCallback<String>() {
  public void onSuccess( String pValues ) {
    ... handle success ...
  }

  public void onFailure( Throwable pCause) {
    ... handle failure ....
  }
}));

Modality.appModal は、UI 部分を実行する AsyncCallback を返し、成功または失敗の後、呼び出しでパラメーターとして指定された AsyncCallback にディスパッチします。

コードジェネレーターをさらに使用する価値はありますか? 一度実装すれば、それ以上考えることなくどこでも使用できます。

デビッド

于 2009-09-29T06:32:50.103 に答える
2

ajax 呼び出し用の util クラスを作成することで、この問題を解決しました。このクラスには、loadingIndicatorcallstaackが含まれています。loadingIndicatorは、メッセージを表示するPopupPanelです。コールスタックは、読み込みインジケータを必要とする実際の AsyncCallbackオブジェクトすべて含む静的リストです。コールバックが発生すると (成功またはエラー)、コールバックはリストから削除されます。ローディング インジケータは、リストにコールバックが残っていない場合にのみ非表示になります。

public class Ajax {

    private static final PopupPanel loadingIndicator = WidgetFactory.createLoadingPopup();
    private static final List<AsyncCallback<?>> callstack = new ArrayList<AsyncCallback<?>>();

    public static <T> AsyncCallback<T> call(final AsyncCallback<T> callback) {
        if(!loadingIndicator.isShowing()){
            loadingIndicator.center();
        }
        callstack.add(callback);
        return new AsyncCallback<T>() {
            @Override
            public void onFailure(Throwable caught) {
                handleReturn();
                callback.onFailure(caught);
            }

            @Override
            public void onSuccess(T result) {
                handleReturn();
                callback.onSuccess(result);
            }

            private void handleReturn(){
                callstack.remove(callback);
                if(callstack.size() < 1) {
                    loadingIndicator.hide();
                }
            }
        };
    }
}

そして、次のような読み込みインジケーターが必要な RPC 呼び出しに使用します。

myService.myMethod(Ajax.call(new AsyncCallback<MyReturnType>() { 
    @Override
    public void onFailure(Throwable caught) { ... }

    @Override
    public void onSuccess(MyReturnType result) { ... }
}));
于 2012-08-17T19:56:02.430 に答える
1

ここでいくつかの答えを見つけることができます:非同期関数を呼び出すときの自動「読み込み」インジケーター

このページの他の人たちと同じように、これにはコード ジェネレーターを使用する価値はありません。

于 2009-09-29T11:18:29.097 に答える