2011-10-06 12 views
1

我正在使用GWTs活動和地方几乎所述http://code.google.com/webtoolkit/doc/latest/DevGuideMvpActivitiesAndPlaces.html,它都工作正常。使用GWT活動和地點我可以導航到前一頁而不使用History.back()?

我想要做的是從特定頁面導航到前一頁,而不使用History.back(),因爲我不想丟失歷史狀態。 (我有一個頁面,用戶執行一個動作,成功時我想返回到前一頁並保持歷史狀態,另一方面,如果他們取消,我想用History.back(),因爲我想要失去狀態) 。

我能想到的要做到這一點的唯一方法是創建一個偵聽地點/歷史變化事件,使現有的以前的地方我我自己的地方/歷史跟蹤代碼,這樣我可以調用placeController.goto(...)

有沒有更簡單的方法來做到這一點?我錯過了什麼嗎?

回答

1

你必須記得要返回,因爲不是取消用戶可以點擊後退按鈕,這將與點擊取消相同,除非你的應用程序沒有執行代碼,所以你沒有控制。

其次,如果您在網址中有歷史記錄,則用戶可以直接導航到該頁面,然後在用戶單擊確定時應該知道該去哪兒。或者如果用戶直接進入該頁面,則將用戶重定向到另一個頁面。

一種方法是將返回歷史記錄標記存儲在要訪問的頁面的歷史記錄標記中。當頁面完成後,它可以根據傳遞的返回令牌返回(或者從技術上講,它將'前進')到該頁面。 (儘管使用GWT,您可以輕鬆地將代碼中的歷史記號存儲起來)。

2

我採取的方法是在代碼中存儲歷史記號(如建議)。我擴展了PlaceController並用它來跟蹤EventBus上的Place變化。現在無處不在我使用PlaceController,而是使用PlaceControllerExt,它有一個很好的previous()方法,可以將我帶回我來自的地方 - 但向前導航,永遠不會離開應用程序。

public class PlaceControllerExt extends PlaceController { 

    private final Place defaultPlace; 
    private Place previousPlace; 
    private Place currentPlace; 

    public PlaceControllerExt(EventBus eventBus, Place defaultPlace) { 

     super(eventBus); 
     this.defaultPlace = defaultPlace; 
     eventBus.addHandler(PlaceChangeEvent.TYPE, new PlaceChangeEvent.Handler() { 

      public void onPlaceChange(PlaceChangeEvent event) { 

       previousPlace = currentPlace; 
       currentPlace = event.getNewPlace(); 
      } 
     }); 
    } 

    /** 
    * Navigate back to the previous Place. If there is no previous place then 
    * goto to default place. If there isn't one of these then it'll go back to 
    * the default place as configured when the PlaceHistoryHandler was 
    * registered. This is better than using History#back() as that can have the 
    * undesired effect of leaving the web app. 
    */ 
    public void previous() { 

     if (previousPlace != null) { 
      goTo(previousPlace); 
     } else { 
      goTo(defaultPlace); 
     } 
    } 
} 
相關問題