我有一个GWT应用程序,我正在使用GWT MVP和地方/活动。
我的应用程序布局类似于
MENU | CONTENT
菜单和内容显示将动态变化,其中一个与另一个分开。我的意思是,当内容显示更改时,我不想更新菜单显示,反之亦然。两个显示都需要能够响应PlaceChangeEvents并在发生这些事件时自行更新。问题是每个显示应该只响应某些PlaceChangeEvents而更新,忽略指向另一个显示的PlaceChangeEvents。然而,使用“标准”GWT MVP模式不起作用,因为即使每个显示器都有自己的ActivityManager,它们也会自动获取所有PlaceChangeEvents,因为有一个PlaceController监听单个EventBus。我能看到的唯一方法是使用两个EventBus和两个PlaceControllers - 一个用于菜单,一个用于内容。所以我的问题是这是一个很好的解决方案,还是有一个更简单/更好的方法,我错过了?此解决方案的一个问题是PlaceHistoryHandler只能在其中一个EventBus中注册。
答案 0 :(得分:5)
地点更改实际上由ActivityMappers控制。他们获得一个Place并返回相应的Activity。您可以在此处控制“地方”如何映射到“活动”:
您需要创建两个ActivityMappers(MenuActivityMapper,ContentActivityMapper),然后使用它自己的ActivityMappers实例化两个ActivityManagers。然后,对于每个ActivityManager,您调用setDisplay(AcceptsOneWidget display)
,其中每个您在一个区域(显示)中传递它将显示其内容。
对于菜单,您可能只使用一个活动,因为它在所有地方都可用。因此MenuActivityMapper.getActivity()
将始终返回MenuActivity的相同实例。为了使MenuActivity能够根据场所变化调整外观,MenuActivity应该收听PlaceChangeEvents。