2013-03-26 162 views
3

我正在使用GWT編寫Web應用程序,並且在GWT網站上使用MVP tutorial(即使用History進行導航)。GWT MVP導航邊欄

我有點困惑,具有導航側邊欄的最好的方法(即點擊導航鏈接改變主窗口中的內容。見下文)

我看到的
-------------------- 
|  |   | 
| nav | main  | 
|  | window | 
|  |   | 
|  |   | 
-------------------- 

一個潛在的方法這樣做是爲了在導航和內容的HTML中聲明兩個<div>標記。例如:

@Override 
public void onValueChange(ValueChangeEvent<String> event) { 

    ... 

    if (token.equals("navigation")) { 
     presenter = new NavigationPresenter(rpcService, eventBus, new NavigationView()); 
     presenter.go(RootPanel.get("navigation")); 
    } 

    ... 

    if (token.equals("content")) { 
     presenter = new ContentPresenter(rpcService, eventBus, new ContentView()); 
     presenter.go(RootPanel.get("content")); 
    } 

    ... 
} 

我不確定這是否是解決此問題的最佳方法。 (我猜導航面板和內容窗口之間的雙向通信可以通過EventBus來完成?當涉及到更改UI(例如移動站點)時,此方法是否靈活)

我想知道人們會建議是解決這個問題的最好方法。我已閱讀各地,通常落在約Activities and Places討論,但據我所知,這些都是MVP的架構有所不同(活動和地點是browser history management有用的,但我認爲我使用的History覆蓋了(?))

任何建議,將不勝感激。

回答

3

是的,你是對的:Activies and Places是關於歷史和導航管理,GWT裏面的框架。 MVP只是一個建築設計模式。您可以使用您鏈接的文章中顯示的框架來實現MVP

在您的示例中,您可以按照您的說法進行操作,但爲了避免任何潛在的昂貴重新創建,我會將每個視圖設置爲(懶惰)單例。就我個人而言,我不喜歡這種方式,您最終會根據(很多)HasXxx接口定義您的Display

我認爲,如果歷史管理很重要,那麼選擇Activities and Places幾乎是一件容易的事情(至少對我來說,至少對於定義應用程序的框架來說)是至關重要的。 Here你可以找到一篇非常好的文章來幫助你入門。你會看到你的用例有多普遍:你必須定義顯示的區域(你的導航和主要區域),這些區域會對位置變化做出反應(感謝活動經理),並創建/重新啓動活動,以便更新UI 。通過這種方式,您可以實現某種應用程序範圍MVP,其中演示者是活動。

至於MVP而言,有這樣做的沒有最好的辦法part 1part 2MVP with A&P只是不同的方式來達到同樣的目標:表示和業務邏輯之間的分離,以及純的JUnit測試。只需選擇你喜歡的。請參閱this關於羣組的帖子以供參考。

希望能讓你開始。

+0

首先@Andrea Boscolo絕對是正確的:我研究了我的謙虛大腦可能想出的各個角度下的歷史管理,而Acitivities&Places是實現歷史製圖而不重新發明輪子的最佳方式。 – 2013-03-26 20:18:41

+0

它唯一的缺點是通過PlaceHistoryMapper @WithTokenizers生成方式標記:URL很醜陋IMO,地點前綴由「:」分隔,然後是參數。 我已經實現「自我符號化」的地方,所產生像URL:「www.myapp.com/#/placeprefix/param1=value1¶m2=value2 而不是GWT的標準:www.myapp.com/#placeprefix:anythingelseinthetoken ...這只是因爲我是一個網址瘋子可能 – 2013-03-26 20:33:46

0

對於我的應用程序,我使用ClientFactory,就像在GWT文檔中一樣,使用單例視圖。

這樣,應用程序結構(包括菜單)也是ClientFactory中引用的單例,所以每個其他視圖都可以通過它的接口直接對其進行虛擬訪問。

例如,某些視圖可能會在標題中推送某些圖像,隱藏菜單以顯示視頻或您需要的任何內容。大多數情況下,應用程序的結構不需要一個單獨的活動/地點來「堅持」其歷史堆棧中的狀態...

我知道大多數人不喜歡互相調用的意見,所以做我,唯一的例外是應用程序的結構視圖,這是一種特定的結構視圖:它有一個演示者,這不是一個活動,並且視圖本身永久顯示。

通知您的應用程序結構和其他視圖與通知將使您的應用程序意大利麪盆恕我直言。我曾經使用PureMVC這樣的框架,這些框架很大程度上依賴於事件/通知在視圖之間進行通信,分離的成本很高:可維護性和代碼可讀性。