假设我想创建一个由两个简单“屏幕”组成的 GWT 应用程序:
- 用户在应用程序首次启动时看到的主菜单(他们转到特定的 URL)- 对于这个简单的示例,忘记登录屏幕等;和
- 编辑首选项“页面”/屏幕/ View ,当用户单击主菜单上的按钮时,它会取代主菜单;此“编辑首选项”屏幕还有一个按钮,可将用户带回主菜单;因此
- 用户可以整天简单地在主菜单和编辑首选项“页面”(这是 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;
}
问题:
地点
及其关联的Activity
如何适应这种范式?如果它是 MVP 和 Places/Activities 之间的选择,那么使用 Activities/Places 范例的这个示例看起来如何?- 如果 MVP 和 Activities/Places 可以很好地协同工作(并且不相互排斥),那么我们如何在这里实现 GWT 的 History API,以便我们可以将
MainMenuView
设置为历史中的一个“位置” ,EditPreferencesView
作为第二个“位置”,然后允许用户点击后退/前进浏览器按钮并在它们之间不断切换? - 如果 MVP 和 Activities/Places 相互排斥,而我必须在两者之间做出选择,那么上面问题 #2 中的代码是否有任何不同之处需要更改?
我还对 Place
如何与 ActivityManager
相关联,以及如何/由谁触发/处理 PlaceChangeEvents
感兴趣,但我我会保存它以备后用;我需要先了解这些概念,然后才能继续学习这些概念。提前致谢!
最佳答案
我将尝试概述一个适用于您的情况的示例设置。有很多变体,但我想专注于一个简单的变体(并鼓励您思考可以调整的地方)。
1。定义 URL 标记
选择一些 URL 标记,例如“#mainmenu”和“#editprefs”,它们将附加到主机页面的 URL。它们将用于浏览器历史记录,因此后退和前进按钮起作用等。
URL 处理将由 DefaultHistorian 自动为您完成。 PlaceChangeEvent 将由 PlaceController 触发。
2。将标记映射到 Place 对象
Place 对象只是 token 的面向对象抽象 - 这很有用,因为更高级的 token 也可以采用需要解析的参数。您需要一种方法将标记映射到 Place 对象。这是 PlaceHistoryMapper 的职责。
在我的示例中,我们将简单地手动实现 PlaceHistoryMapper 以将“#mainmenu”映射到 MainMenuPlace 并将“#editprefs”映射到 EditPreferencesPlace。
[或者,也可以使用@WithTokenizers 注释并为每种类型的地点实现一个(空的)PlaceTokenizer。然后,您可以使用 @Prefix 注释将“mainmenu”和“editprefs”指定为标记。]
3。将地点映射到 Activity
Place 对象本身不做任何事情——如上所述,它基本上只是一个抽象标记。实际代码将在 Activity 中运行。因此,您必须将地点映射到 Activity 。这是 ActivityMapper 的职责。
在我的示例中,您将实现它以将 MainMenuPlace 映射到 MainMenuActivity 并将 EditPreferencePlace 映射到 EditPreferenceActivity。
4。 Activity 和主持人
为简单起见,在我的示例中, Activity 还将实现 Presenter。所以 MainMenuActivity 将实现 MainMenuPresenter。这根本不是必需的,但也许是一个不错的起点。这就是 Places+Activities 可以与 MVP 连接的地方。这两个概念互不要求,但可以很好地协同工作:
- Activities+Places 基本上是关于历史 token 和 Activity 之间的连接。
- MVP 基本上是关于 Presenter 和 View 之间的连接。
如果您让 Activity(或其委托(delegate)之一)实现 Presenter,则您已将两者连接起来。
5。快速概览
"#mainMenu"
---(PlaceHistoryMapper)---> MainMenuPlace
---(ActivityMapper)---> MainMenuActivity implements MainMenuPresenter
关于java - GWT:地点、历史和 MVP 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12326192/