4

假设我想创建一个包含两个简单“屏幕”的 GWT 应用程序:

  • 用户在应用程序首次启动时看到的主菜单(他们转到特定的 URL) - 忘记登录屏幕等,对于这个简单的示例;和
  • 当用户单击主菜单上的按钮时,一个编辑首选项“页面”/屏幕/视图代替主菜单;此编辑首选项屏幕还有一个按钮,可将用户带回主菜单;因此
  • 用户可以整天简单地在主菜单和编辑首选项“页面”(这是 GWT 所以它实际上是一个单页应用程序)之间来回切换

所以这个的伪代码可能看起来像:

public class MainMenuPresenter implements Presenter {
    // mainMenuScreen may be a Composite that contains a Button for
    // switching/navigating to the EditPreferencesView
    private MainMenuView mainMenuScreen;
}

public class EditPreferencesPresenter implements Presenter {
    // editPrefsScreen may be a Composite that contains a Button for
    // switching/navigating back to the MainMenuView
    private EditPreferencesView editPrefsScreen;
}

问题:

  1. aPlace和它的关联如何Activities适应这个范式?如果是在 MVP 和 Places/Activity之间进行选择,那么这个示例在使用 Activities/Places 范式时会如何?
  2. 如果 MVP 和 Activities/Places 可以很好地配合使用(并且不是相互排斥的),那么我们如何在此处实现 GWT 的 History API,以便我们可以将其设置MainMenuView为历史中的一个“地方”,EditPreferencesView作为第二个“地方”,然后允许用户点击后退/前进浏览器按钮并继续在它们之间切换?
  3. 如果 MVP 和活动/地点是互斥的,我必须在两者之间进行选择,那么上面问题 #2 中的代码有什么不同需要更改吗?

我还对a如何Place与 我需要先了解这些概念,然后才能继续讨论这些概念。提前致谢!ActivityManagerPlaceChangeEvents

4

1 回答 1

5

我将尝试概述一个可以在您的情况下工作的示例设置。有很多变化,但我想专注于一个简单的(并鼓励你想出可以调整的地方)。

1. 定义 URL 令牌

选择一些 URL 标记,例如“#mainmenu”和“#editprefs”,它们将附加到主机页面的 URL。它们将用于浏览器历史记录,因此后退和前进按钮可以工作等。

DefaultHistorian 将自动为您完成 URL 处理。PlaceChangeEvent 将由 PlaceController 触发。

2. 将标记映射到 Place 对象

Place 对象只是令牌的面向对象的抽象——这很有用,因为更高级的令牌也可以采用需要解析的参数。您需要一种将标记映射到 Place 对象的方法。这是PlaceHistoryMapper的职责。

在我的示例中,我们只需手动实现 PlaceHistoryMapper,将“#mainmenu”映射到 MainMenuPlace,将“#editprefs”映射到 EditPreferencesPlace。

[或者,也可以使用@WithTokenizers 注释并为每种类型的地点实现一个(空)PlaceTokenizer。然后,您可以使用 @Prefix 注释将“mainmenu”和“editprefs”指定为标记。]

3. 将地点映射到活动

Place 对象本身不做任何事情 - 如上所述,它基本上只是一个抽象标记。实际代码将在 Activity 中运行。因此,您必须将地点映射到活动。这是ActivityMapper的职责。

在我的示例中,您将实现它以将 MainMenuPlace 映射到 MainMenuActivity 并将 EditPreferencePlace 映射到 EditPreferenceActivity。

4. 活动和演讲者

为简单起见,在我的示例中,Activity 还将实现 Presenter。所以 MainMenuActivity 将实现 MainMenuPresenter。这根本没有必要,但也许是一个不错的起点。这就是 Places+Activity 可以与 MVP 连接的地方。这两个概念不需要彼此,但它们可以很好地协同工作:

  • 活动+地点基本上是关于历史令牌和活动之间的连接。
  • MVP 基本上是关于 Presenter 和 View 之间的连接。

如果您让一个 Activity(或其代表之一)实现一个 Presenter,那么您已经连接了两者。

5. 快速概览

"#mainMenu"
---(PlaceHistoryMapper)---> MainMenuPlace
---(ActivityMapper)---> MainMenuActivity implements MainMenuPresenter
于 2012-09-07T23:25:07.767 回答