GWT MVP在地点更改时更新活动状态
更改地点时更新活动状态的最佳做法是什么?假设您有一个活动视图,其中显示类别列表和类别中的项目列表。如果选择了不同的类别,则应用程序将转到具有类别ID的新位置。然后,我只希望刷新项目,而不希望创建同时重新读取类别列表的新活动 我目前的做法是: 备选方案包括:GWT MVP在地点更改时更新活动状态,gwt,mvp,gwt-mvp,gwt-places,gwt-activities,Gwt,Mvp,Gwt Mvp,Gwt Places,Gwt Activities,更改地点时更新活动状态的最佳做法是什么?假设您有一个活动视图,其中显示类别列表和类别中的项目列表。如果选择了不同的类别,则应用程序将转到具有类别ID的新位置。然后,我只希望刷新项目,而不希望创建同时重新读取类别列表的新活动 我目前的做法是: 备选方案包括: 从活动中收听PlaceChangeEvent(然后可以使用FilteredActivityMapper和CachingActivityMapper在ActivityMapper中缓存活动,以便在请求时仅创建新活动)。† 让某些组件侦听pl
- 从活动中收听
(然后可以使用PlaceChangeEvent
和FilteredActivityMapper
在CachingActivityMapper
中缓存活动,以便在请求时仅创建新活动)。†ActivityMapper
- 让某些组件侦听
s并将其转换为面向业务的事件,然后活动侦听这些事件,而不是placechangevent
s,否则与上述相同placechangevent
- 将活动与“屏幕”分离,使“屏幕”成为带有
方法的单例,并从活动的reset()
调用该方法(在本例中可能将类别ID作为参数传递)。“屏幕”是一个单件,因此可以确保只加载一次类别列表start
- 在您的情况下,您也可以简单地将类别列表放在共享缓存中,这样您就不必重用您的活动,因为您可以创建一个新的,类别列表将被检索一次并放入缓存中,后续的活动实例将只使用缓存中的内容。这与上面的类似,但更简单,并且缓存可以由应用程序的其他部分使用
†。我不喜欢将我的活动与它们使用的地方耦合(我也不太喜欢
goTo
调用的耦合,但还没有找到一个干净简单的替代方案),所以我不想使用这个选项;类似地,我不会像您那样将位置传递给活动构造函数和refresh
方法,而是从该位置提取信息并将其传递给活动(例如,在您的情况下,只为活动提供类别ID,而不是ItemListPlace
实例;然后我只需在所有情况下调用setCategory
,甚至不将类别ID传递给构造函数).我不会在我的ActivityMapper中执行任何逻辑,除非通过创建一个新的活动或提供一个以前的活动(或null)来返回一个活动。根据我的说法,映射器不必知道refresh()或活动是做什么的
如果是这样,则“refresh()”的逻辑将通过保存令牌的位置提供给activy。该令牌应保存关于请求状态的信息(新页面、重新加载、id等)
在活动中,首先,它请求视图,即与此活动相关的视图(提示:“ClientFactory”提供的单例是一种好的做法),然后它为该视图创建一个演示者,并将它们绑定在一起
最后,活动将使用来自该位置的令牌向演示者提供有关状态的任何信息。然后,它在页面中添加视图
默认情况下,对于地点和活动,去同一个地点不会做任何事情(无需重新加载),这是很好的,但是您可以使用令牌和活动映射器轻松地处理它
希望您能找到适合您情况的解决方案。祝您好运。在我看来
的作用是从ActivityMapper
返回位置
活动
的作用是启动从ActivityManager
返回的ActivityMapper
,并在不同的情况下停止当前活动。在您的情况下,您希望“更新/刷新”当前的活动
活动
ActivityMapper
,因为它将始终为给定类型的位置
返回相同的Activity
实例。这样做的一个好方法是使用GIN并在(singleton.class)中使用singleton作用域…注入您的Activity
如果您这样做,在更改url时,如果位置保持不变(表示您的url在#之后和之前有相同的单词:)为了使您的位置类型保持不变,ActivityMapper
将返回相同的Activity
实例,因此ActivityManager
将不对Activity
执行任何操作。请检查ActivityManager
的l.126
if (currentActivity.equals(nextActivity)) {
return;
}
对我来说,你有两个选择。第一个,正如Thomas所说,是在你的活动中收听placechangevent
。你将收到的新Place
可以基于给定的新url在里面有新参数,你可以“更新/刷新”你的活动
第二个,我发现更符合Activity/Place模式的是修改ActivityManager
,这样当ActivityMapper
返回的Activity
与当前的Activity
相同时,它就会调用Activity
上的更新(Place)方法
我还没有尝试过任何这些解决方案,但我很快就会…我可能会在那个时候更新那个帖子
下面是我制作的一个小模式,希望能帮助我理解这个模式
if (currentActivity.equals(nextActivity)) {
return;
}