MVP模式:多个演示者应该解耦还是可以直接通信?

时间:2009-02-23 04:29:52

标签: model-view-controller mvvm mvp

我有一个看起来像这样的UI:

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

我正在使用MVP pattern来推动这个ui。

我在这里简化了很多,但为了分而治之,我想将Presenter分成两部分:一部分在左边的View中处理用户手势(用户在此视图中更改了Model列表,例如,排序)和另一个在右侧视图中处理用户手势的Presenter(用户在此视图中更改单个模型)。

当左侧的Presenter与整个模型列表交互时,右侧的Presenter只与一个模型交互:用户从左侧列表中选择的模型。如果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();
}

以下是关于MVP模式或任何MVC GUI模式的模糊部分:

  1. ui可以由多个这样的演示者驱动吗?
  2. 多个演示者应该分离,还是可以直接相互沟通,如图所示?
  3. 所以我的问题归结为:RightPresenter用户选择LeftPresenter视图中的模型的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

1。可以由多个人驱动     主持人是这样的吗?

2。应该有多位演示者     解耦或者他们可以沟通     如图所示,彼此直接相关     在这里?

我处理它的方式是我有一个看起来像这样的框架

当事件发生时,UI_Object处理创建和触发Command对象的事件。每个UI_Object实现UI_Views中的View Interface,并使用UI_View注册自身。命令对象可以通过接口访问UI_View中注册的UI对象。

例如,在我的一个金属切割应用中,有一个名为HOLD的屏幕元素,其中包含未放置在金属板上用于切割的所有部件。一部分可以通过几种方式进入。从零件文件加载,由形状编辑器创建,由我们的CAD屏幕创建,或从金属板中拾取。

每个操作都封装在实现命令设计模式的单独Command对象中。当命令对象执行时,它会调用。

CuttingScreen.Refresh
CADScreen.Refresh
ShapeEditor.Refresh

每个都会刷新相应的屏幕以更新保留。

现在我可以在我的应用程序界面中添加一个方法。 MyCuttingApplication.HoldRefresh将依次调用所有三个刷新。

但重要的是,您的视图调用一个命令,该命令使用视图实现的接口进行更新。视图对象将自己注册在较低层。