2012-07-11 33 views
1

我正在使用gwt-platform,objectify和appengine(java)。來自gwt平臺的動作被執行多次

我試圖在最佳實踐後創建用戶和會話管理系統。我希望這是一個可重用的應用程序模塊。

我在我的應用程序中,基於gwt-platform中的Dispatch模塊,一個Login操作和一個Logout操作。

當我進入應用程序時,登錄屏幕出現,一切工作正常。如果我在演示者之間導航,然後按下注銷按鈕,我會看到多次執行註銷操作或任何其他操作。 Action的執行次數(應該只運行一次)似乎與在演示者之間導航的次數成正比。

該項目的源代碼在託管:http://code.google.com/p/gwt-platform-appengine-session-login-example/

如果有人能夠給我的什麼是錯的,那就太棒了一些提示。另外,如果有人也想爲這個項目做出貢獻,我們將會感激一些幫助。請發電子郵件給我。

回答

4

問題是,您在onReset()方法中爲註銷按鈕添加EventHandler。
但是,如果您檢查GWTP文檔,則每次導航到演示者時都會調用onReset()方法。因此,如果多次導航到演示者,EventHandler將被多次添加並因此多次執行(與您打開演示者的次數成正比)。

移動EventHandleronReset()方法進入onBind()方法,因爲onBind()僅在演示者的生命週期調用一次,這是你應該添加EventHandlers的地方。除此之外,它還包含在registerHandler()方法中,以便在調用onUnbind()時自動刪除它。

FirstApplicationPresenter.java

@Override 
protected void onBind() { 
    super.onBind(); 
    getView().getLogoutBtn().setText("Logout "+username); 
    registerHandler(getView().getLogoutBtn().addClickHandler(new ClickHandler() { 
     @Override 
      public void onClick(ClickEvent event) { 
       Logout action = new Logout(); 
       dispatchAsync.execute(action, logoutCallback); 
      } 
    })); 
} 

@Override 
protected void onReset() { 
    super.onReset(); 
}    
+0

非常感謝你。這是正確的答案。任何幫助表示讚賞。 – Berry 2012-07-12 15:36:08