我正在使用GWT编写Web应用程序,并遵循GWT网站上的MVP tutorial(即使用History
进行导航)。
我对使用侧栏进行导航的最佳方式感到有点困惑(即点击导航链接更改主窗口中的内容。见下文)
--------------------
| | |
| nav | main |
| | window |
| | |
| | |
--------------------
我看到这样做的一种可能方式是在HTML中声明两个用于导航和内容的<div>
标记。例如:
@Override
public void onValueChange(ValueChangeEvent<String> event) {
...
if (token.equals("navigation")) {
presenter = new NavigationPresenter(rpcService, eventBus, new NavigationView());
presenter.go(RootPanel.get("navigation"));
}
...
if (token.equals("content")) {
presenter = new ContentPresenter(rpcService, eventBus, new ContentView());
presenter.go(RootPanel.get("content"));
}
...
}
我不确定这是否是接近此问题的最佳方法。 (我猜导航面板和内容窗口之间的双向通信可以通过EventBus
完成?这种方法在更改UI时是否灵活(例如移动网站)
我想知道人们会建议什么是最好的解决方法。我已阅读并经常讨论有关Activities and Places的讨论,但据我了解,这些与MVP架构有些不同(活动和地点对browser history management有用,尽管我认为我使用{{1}覆盖那个(?))
任何建议都将不胜感激。
答案 0 :(得分:3)
是的,你是对的:Activies and Places
是关于历史和导航管理的,GWT
内的框架。 MVP
只是一种建筑设计模式。您可以使用您链接的文章中显示的框架来实现MVP
。
在你的样本中,你可以按照你的说法去做,但是我会让每个视图成为一个(懒惰的)单例,以避免任何可能很昂贵的重新创建。就个人而言,我不喜欢这种方式,你最终用(很多)Display
接口来定义你的HasXxx
。
我认为如果历史管理很重要,选择Activities and Places
几乎是不费脑子的(至少对我来说,至少是定义应用程序的骨架)。 Here你可以找到一篇非常好的文章来帮助你入门。您将看到您的用例有多常见:您必须定义显示的区域(导航和主要区域),这些区域将对位置更改做出反应(感谢活动管理器)并创建/重新启动活动,这些活动将更新UI 。通过这种方式,您可以实现某种应用范围MVP
,其中演示者是活动。
就MVP
而言,没有最佳方式这样做:part 1,part 2和MVP with A&P完全不同实现相同目标的方法:表示和业务逻辑之间的分离,以及纯粹的junit测试。只需选择您喜欢的。请参阅论坛上的this帖子以供参考。
希望能帮到你。
答案 1 :(得分:0)
对于我的应用程序,我使用ClientFactory就像在GWT文档中一样,使用单例视图。
这样,应用程序结构(包括菜单)也是ClientFactory中引用的单例,因此每个其他视图都可以通过其接口直接访问它。
例如,某些视图可能会在标题中推送一些图像,隐藏菜单以显示视频,或者您需要的任何内容。大多数情况下,应用程序的结构不需要单独的活动/地点来“保持”其在历史堆栈中的状态......
我知道大多数人不喜欢互相调用视图,我也是如此,唯一的例外是应用程序的结构视图,它是一种特定的视图:它有一个不是活动的演示者,并且视图本身会永久显示。
通过通知在您的应用结构和其他视图之间进行通信将使您的应用成为意大利面条碗恕我直言。我曾经使用像PureMVC这样的框架,它们非常依赖事件/通知来在视图之间进行通信,而且分离的成本很高:可维护性和代码可读性。