2

Webアプリケーションで機能しているインジケーターを表示および非表示にする方法を探しています。モデルビュープレゼンターパターンでGWTを使用しており、プレゼンターオブジェクトであるさまざまなページやアクティビティ用の場所があります。

私がこれまでに試したこと:

ビューオブジェクトは、

public interface HasWorkingIndicator 

void showWorkingIndicator(boolean show);

アクティビティオブジェクトは、startメソッドのビューオブジェクトでshowWorkingIndicatorを呼び出します。

     @Override
     public void start(final AcceptsOneWidget panel, EventBus eventBus){
         page.showWorkingIndicator(true);
         //more code...
     }

では、WorkingIndicatorViewを非表示にする最良の方法は何ですか?start()の最後にshowWorkingIndicator(false)を呼び出すことはできません。これは、その時点でページが設定されていないためです。多分見るべきパターンはありますか?

4

3 に答える 3

3

インジケーターを表示する方法/場所/タイミングによって異なります。

目標がアクティビティの場所に表示することである場合は、2つの選択肢があります。ビューで処理するか、アクティビティに渡されsetWidgetたものを2回呼び出す:1回は待機インジケーターウィジェットを使用し、次に実際のアクティビティのビューを使用します。 。指定された表示領域 のアクティビティが常に存在することを保証できる場合は、実装でこれをベイク処理することもできます。が呼び出されたときに待機インジケーターを表示します(同様のトリックは、アクティビティの待機インジケーターウィジェット)。AcceptsOnWidgetstart()
AcceptsOneWidgetsetWidgetnullIsWidgetasWidgetnullstart

ただし、グローバルインジケーターを使用できる場合は、NotificationMoleまたは同様のウィジェットを使用して、保留中のRPC / RequestFactory呼び出しや、アクティビティからイベントバスにディスパッチするイベントに応じてその表示をトリガーできます。

于 2012-12-18T17:59:03.777 に答える
1

アクティビティを使用している場合、これは非常に簡単なタスクになります。

アクティビティを実装するAbstractActityがあります。これは、クライアントファクトリや親パネルなどを処理します。

Activityインターフェースは、mayStop()、onStop、onStartなどを実装します。

public class WorkingIndicator extends Composite {

    private static WorkingIndicator instance = null;

    private WorkingIndicator(){
       initWidget(new Label("Working"));
    }

    public static WorkingIndicator getInstance() {
       if (instance == null) {
          instance = new WorkingIndicator();
      }
      return instance;

    }

    public void show() {
        RootLayoutPanel.get().add(this);
    }

    public void hide() {
        RootLayoutPanel.get().remove(this);
    }

}

アクティビティは次のようになります。

public abstract class AbstractActivity<T extends ApplicationPlace, V extends View> implements Activity {

    protected ClientFactory clientFactory;
    protected EventBus eventBus;
    protected AcceptsOneWidget parentPanel;
    protected final T place;
    protected final V display;

    protected final List<HandlerRegistration> handlers = new ArrayList<HandlerRegistration>();


    public AbstractActivity(T place, ClientFactory clientFactory, V display) {
        this.place = place;
        this.clientFactory = clientFactory;
        this.display = display;
    }

    protected void setEventBus(EventBus eventBus) {
        this.eventBus = eventBus;
    }

    protected EventBus getEventBus() {
        return this.eventBus;
    }

    @Override
    public void start(AcceptsOneWidget parentPanel, EventBus eventBus) {
        this.parentPanel = parentPanel;
        this.eventBus = eventBus;

        parentPanel.setWidget(display.asWidget());
        bindToView();
        WorkingIndicator.getInstance().hide();
    }

    public AcceptsOneWidget getParentPanel() {
        return parentPanel;
    }

    public T getPlace() {
        return place;
    }

    public V getDisplay() {
        return display;
    }

    public ClientFactory getClientFactory() {
        return clientFactory;
    }

    /**
     * Shortcut getter for the CSS style in Resources.
     *
     * @return
     */
    public Style style() {
        return clientFactory.getResources().style();
    }

    @Override
    public String mayStop() {
        return null;
    }

    @Override
    public void onCancel() {
    }

    @Override
    public void onStop() {
      cleanup();
      display.reset();
      WorkingIndicator.getInstance().show();
    }

  protected void addHandler(HandlerRegistration registration) {
    handlers.add(registration);
  }

    public List<HandlerRegistration> getHandlers() {
        return handlers;
    }

    protected void cleanup() {
        for (HandlerRegistration handler : handlers) {
            handler.removeHandler();
        }
    }

    /**
     * This function will be called immediately after adding the view to the
     * DOM. This function should be used to hook up click handlers, populate
     * HasData handlers and such.
     */
    protected abstract void bindToView();

    protected DaoRequestFactory daoRequestFactory() {
        return clientFactory.daoRequestFactory();
    }

    protected AnalyticsTaskRequest analyticsTaskRequest() {
        return clientFactory.daoRequestFactory().analyticsTaskRequest();
    }

    protected EventBus eventBus() {
        return clientFactory.getEventBus();
    }

    protected PersonProxy currentPerson() {
        return clientFactory.getCurrentPerson();
    }
}
于 2012-12-18T16:39:19.737 に答える
1

場所は瞬時に変わります。(A)ビューが初めて構築されるとき、または(B)ビューを表示する前にサーバーからデータが到着するのを待つときに、インジケーターを表示したいとします。

いずれの場合も、ビューにフラグ(isInitialized()など)を追加して、ビューを構築するために何かを行う必要があるかどうか(DataGridの作成、ツリーへの入力など)をアクティビティに通知する必要があります。以前にビルド済みであるため、この手順はスキップできます。

アクティビティを開始したら、ビューが初期化されているかどうかを確認します。そうでない場合は、負荷インジケーターを表示します。UIをブロックするためにガラスを有効にしたシンプルなPopupPanelをお勧めします。アクティビティがビューの構築/データのロードを完了すると、ビューにフラグを設定する必要があります(たとえば、setInitialize())。次に、このポップアップパネルを非表示にします。

于 2012-12-18T22:04:50.053 に答える