GWT MVP - 维护多个彼此独立的显示屏

7
我有一个GWT应用程序,我正在使用GWT MVP与Places / Activities。
我的应用程序布局类似于
菜单 | 内容
菜单和内容显示将动态更改,并且一个更改与另一个分开。我的意思是,当内容显示更改时,我不想更新菜单显示,反之亦然。两个显示器需要能够响应PlaceChangeEvents并在发生这些事件时更新自己。问题在于,每个显示器只应响应特定的PlaceChangeEvents,忽略针对其他显示器的PlaceChangeEvents。但是,使用“标准”GWT MVP模式无法实现此目标,因为即使每个显示器都有自己的ActivityManager,它们也会自动接收到所有PlaceChangeEvents,因为存在单个PlaceController侦听单个EventBus。我唯一能想到的方法是拥有两个EventBus和两个PlaceControllers - 一个用于菜单,一个用于内容。因此,我的问题是,这是否是一个好的解决方案,或者我错过了更简单/更好的方法?这种解决方案的一个问题是,PlaceHistoryHandler只能注册一个EventBus。
1个回答

5

Place变更实际上是由ActivityMappers控制的。它们获取一个Place并返回相应的Activity。这就是你控制如何将Places映射到Activities的地方:

  1. 你需要创建两个ActivityMappers(MenuActivityMapper,ContentActivityMapper),然后实例化两个ActivityManagers,每个都有自己的ActivityMappers。然后对于每个ActivityManager,您都需要调用 setDisplay(AcceptsOneWidget display),其中对于每个区域(display),您都需要传递一个显示其内容的区域。

  2. 对于菜单,您可能只会使用一个Activity,因为它在所有Places中都可用。因此, MenuActivityMapper.getActivity()将始终返回MenuActivity的相同实例。为了使MenuActivity仍然能够根据Place变更来适应其外观,MenuActivity应该监听PlaceChangeEvents。


嗨Peter,感谢您的回复。这是我开始使用的解决方案,但是我遇到了一个问题:当发生应该仅更改Content显示的PlaceChangeEvent时,MenuActivityMapper仍将对该事件做出响应。我尝试在MenuActivityMapper中返回null,以表示它不感兴趣的PlaceChangeEvent,但结果只是导致Menu显示为空白。接下来请看下一条评论... - Josh
我可以像你建议的那样,为所有的PlaceChangeEvents返回相同的MenuActivity,但这意味着每次内容更改(这将经常发生)时都要运行实例化菜单显示的所有逻辑(在我的情况下,这将是相当昂贵的),我想避免这种情况。您对使用两个事件总线来分离每个显示器的事件监听有何评论? - Josh
2
不是这样的。如果你总是返回MenuActivity的同一个实例(即MenuActivityMapper内的单例字段),那么ActivityManager就不会调用它的start()方法:http://www.google.com/codesearch/p?hl=en#A1edwVHBClQ/user/src/com/google/gwt/activity/shared/ActivityManager.java&q=com.google.gwt.activity.shared.activitymanager&d=0&l=111 - Peter Knego
为什么你想要有两个事件总线?你将如何决定哪一个事件总线来触发事件?你可以只有一个事件总线,然后只监听你感兴趣的事件。 - Peter Knego
谢谢Peter,ActivityManager不会调用start()这一事实是我缺失的拼图中的关键部分。干杯! - Josh

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