2009-02-23 59 views
4

我有一個用戶界面,看起來像這樣:MVP模式:多個演示者應該分離或者他們可以直接溝通?

+--------+---------------+ 
    | model1 | model details | 
    | model2 |  here,  | 
    | model3 | loaded as the | 
    |  | user selects | 
    |  | a model from | 
    |  | the left. | 
    |  |    | 
    +--------+---------------+ 

我使用MVP pattern驅動這個UI。

我在這裏簡化了很多,但爲了分而治之,我想將Presenter分成兩部分:一部分處理用戶在左側視圖中的用戶手勢(用戶在此視圖中更改模型列表,例如排序)和另一個在右側視圖中處理用戶手勢的演示者(用戶在此視圖中更改單個模型)。

雖然左側的演示者與整個模型列表進行交互,但右側的演示者僅與單個模型交互:用戶從左側列表中選擇的模型。 IOW從左至右驅動UI。

用戶選擇後(即點擊)在左邊的模型,我當前的實現看起來像(大約):

LeftPresenter.onModelClick = function(event) { 
    var model = this.getModelFromEvent(event); 
    this.view.setSelectedModel(model); // updates list widget on left 
    RightPresenter.setSelectedModel(model); // notify the other Presenter 
} 

RightPresenter.setSelectedModel = function(model) { 
    // lazy load the model from the db, and update the 
    // view when the model fires the "loadComplete" event 
    model.bind('loadComplete', this.view.setModel); 
    model.lazyLoad(); 
} 

這是我在WRT模糊的部分MVP模式,或任何MVC GUI模式:

  1. 是否可以由多個演示者驅動?
  2. 多個演示者應該分離開來,還是可以直接相互溝通?

所以我的問題歸結爲:什麼來指示RightPresenter用戶選擇了LeftPresenter的觀點模型的最佳方式?

回答

1

1.是否可以由多個驅動 這樣的演示者?

2.應多個演示是 解耦或如這裏所示 可以它們彼此通信 直接?

我處理它的方式,我有一個框架,它看起來像這樣

當一個事件發生時,UI_Object處理該事件產生和發射Command對象。每個UI_Object實現一個在UI_Views中找到的視圖接口,並使用UI_View註冊自己。命令對象可以通過接口訪問UI_View中已註冊的UI對象。

例如,在我的一個金屬切削應用中,有一個稱爲HOLD的屏幕元素,其中包含所有未放置在切割金屬片上的零件。一部分可以通過幾種方式進入保持狀態。從零件文件加載,由CAD屏幕創建的形狀編輯器創建,或從一張金屬片拾取。

這些操作中的每一個都被封裝到實現命令設計模式的單獨Command對象中。當命令對象執行它的調用。

CuttingScreen.Refresh 
CADScreen.Refresh 
ShapeEditor.Refresh 

其中每個都會刷新更新保持的相應屏幕。

現在我可以添加一個方法到我的應用程序接口。 MyCuttingApplication.HoldRefresh將依次調用所有三次刷新。

但重要的一點是您的視圖調用一個命令,該命令使用視圖實現的界面進行更新。視圖對象將自己註冊在較低層。

相關問題