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

5

我有一个看起来像这样的用户界面:

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

我正在使用MVP模式来驱动这个用户界面。
为了分而治之,我想将Presenter分成两部分:一个处理左侧视图中的用户手势(用户在此视图中更改模型列表,例如排序),另一个Presenter处理右侧视图中的用户手势(用户在此视图中更改单个模型)。
虽然左侧的Presenter与整个模型列表交互,但右侧的Presenter只与一个模型交互:用户从左侧列表中选择的模型。换言之,用户界面是从左到右驱动的。
当用户选择(即点击)左侧的模型后,我的当前实现大致如下:
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 是否可以像这样由多个 Presenter 驱动?
  2. 多个 Presenter 应该解耦还是可以直接相互通信,就像这里展示的一样?

我的问题归结为:如何最好地向 RightPresenter 指示用户在 LeftPresenter 的视图中选择了一个模型

1个回答

1

1. UI可以由多个Presenter驱动吗?

可以。

2. 多个Presenter应该解耦还是可以像这样直接相互通信?

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

当事件发生时,UI_Object处理事件并创建和触发Command对象。每个UI_Object实现在UI_Views中找到的View接口,并向UI_View注册自己。Command对象可以通过接口访问UI_View中注册的UI对象。

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

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

CuttingScreen.Refresh
CADScreen.Refresh
ShapeEditor.Refresh

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

现在我可以向我的应用程序接口添加一个方法。MyCuttingApplication.HoldRefresh,它将依次调用所有三个刷新。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接