2013-10-26 32 views
2

我正在使用GWTP來構建我的web應用程序。這是我的問題。我有一個客戶頁面(CustPresenter)。當訪問該頁面時,它將調用&從數據庫加載數據。在GWTP的RPC調用期間顯示「加載指示符」的最簡單方法是什麼?

這可能需要一段時間來加載所有的數據,所以我想我目前的瀏覽器鎖定,使用戶無法點擊任何東西,同時數據還沒有完成下載呢。

所以這就是我的想法。我想在我撥打&呼叫完成時隱藏它的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。正如你可以看到,當你第一次打開該鏈接時,加載面板彈出&你不能點擊任何東西,直到所有的guis出現。

我也試圖做一個自定義的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調用期間顯示「加載指示符」的最簡單方法是什麼?

回答

3

我發現一個很酷的解決方案,那就是我們必須在PopupPanel中使用WidgetPresenter(比如說LoadingPresenter)。所以在我的自定義AsyncCall類,我需要火loadingPresenter

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) 

     } 
    }; 

,然後將其真正流暢運行。

相關問題