GWT:地点,历史和MVP示例

IAm*_*aja 4 java mvp gwt android-activity gwt-history

假设我想创建一个包含两个简单"屏幕"的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;
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. a Place和它的关联如何Activities适应这种范式?如果它是MVP和地方/活动之间的选择,那么这个例子将如何使用"活动/地方"范例?
  2. 如果MVP和Activities/Places可以很好地一起玩(并且不是互斥的),那么我们如何在这里实现GWT的历史API,以便我们可以MainMenuView在历史中设置为一个"位置",EditPreferencesView作为第二个"位置",然后允许用户点击后退/前进浏览器按钮并在它们之间切换?
  3. 如果MVP和活动/地点是互斥的,我必须在两者之间做出选择,那么上面问题#2中的代码有什么不同需要改变吗?

我也对如何与一个人Place联系ActivityManager,以及如何/谁开火/处理感兴趣PlaceChangeEvents,但我会保留以后的; 在我继续讨论这些概念之前,我需要先了解这些概念.提前致谢!

Chr*_*her 5

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

1.定义URL令牌

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

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

2.将标记映射到放置对象

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

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

[或者,也可以使用@WithTokenizers注释并为每种类型的场所实现(空)PlaceTokenizer.然后,您可以使用@Prefix批注将"mainmenu"和"editprefs"指定为标记.

3.将地点映射到活动

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

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

4.活动和演示者

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

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

如果您让一个Activity(或其中一个代理人)实现了一个Presenter,那么您已经连接了两个.

5.快速概述

"#mainMenu"
---(PlaceHistoryMapper)---> MainMenuPlace
---(ActivityMapper)---> MainMenuActivity implements MainMenuPresenter
Run Code Online (Sandbox Code Playgroud)