2

我正在寻找一种在我的 Web 应用程序中显示和隐藏工作指示器的方法。我将 GWT 与模型视图演示者模式一起使用,并为我的不同页面和活动(它们是我的演示者对象)提供了位置。

到目前为止我尝试了什么:

视图对象必须实现

public interface HasWorkingIndicator 

void showWorkingIndicator(boolean show);

Activity 对象在 start 方法中调用其视图对象上的 showWorkingIndicator。

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

那么隐藏 WorkingIndicatorView 的最佳方法是什么?我不能在 start() 的末尾调用 showWorkingIndicator(false),因为当时没有设置页面。也许有什么模式可以看?

4

3 回答 3

3

这取决于您想要显示指标的方式/地点/时间。

如果目标是在活动的位置显示它,那么您有两个选择:在视图中处理它,或者对传递给活动的调用setWidget两次:一次使用等待指示器小部件,然后使用真实活动的视图. 如果你能保证给定的显示区域总是有一个活动,那么你也可以在实现中烘焙它:当用 a 调用时你会显示等待指示器(类似的技巧是使用who返回而不是 a活动中的等待指示器小部件)。AcceptsOnWidgetstart()
AcceptsOneWidgetsetWidgetnullIsWidgetasWidgetnullstart

但是,如果您可以使用全局指示器,那么您可以使用一个NotificationMole或类似的小部件,并根据挂起的 RPC/RequestFactory 调用和/或您将从活动在事件总线上调度的事件触发其显示。

于 2012-12-18T17:59:03.777 回答
1

如果您正在使用活动,这将成为一项非常容易完成的任务。

我有一个实现 Activity 的 AbstractActity,它处理我的 clientfactory 和父面板之类的事情。

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(),以告知 Activity 是否需要执行某些操作来构建视图(例如创建 DataGrid、填充树等),或者视图具有之前已经建好了,所以这一步可以跳过。

当您的活动开始时,检查视图是否已初始化。如果没有,请显示加载指示器。我推荐一个简单的 PopupPanel,它启用了玻璃来阻挡 UI。当活动完成构建视图/加载数据时,它应该在视图中设置标志(例如 setInitialize()),然后隐藏此弹出面板。

于 2012-12-18T22:04:50.053 回答