GWT MVP在地点更改时更新活动状态

GWT MVP在地点更改时更新活动状态,gwt,mvp,gwt-mvp,gwt-places,gwt-activities,Gwt,Mvp,Gwt Mvp,Gwt Places,Gwt Activities,更改地点时更新活动状态的最佳做法是什么?假设您有一个活动视图,其中显示类别列表和类别中的项目列表。如果选择了不同的类别,则应用程序将转到具有类别ID的新位置。然后,我只希望刷新项目,而不希望创建同时重新读取类别列表的新活动 我目前的做法是: 备选方案包括: 从活动中收听PlaceChangeEvent(然后可以使用FilteredActivityMapper和CachingActivityMapper在ActivityMapper中缓存活动,以便在请求时仅创建新活动)。† 让某些组件侦听pl

更改地点时更新活动状态的最佳做法是什么?假设您有一个活动视图,其中显示类别列表和类别中的项目列表。如果选择了不同的类别,则应用程序将转到具有类别ID的新位置。然后,我只希望刷新项目,而不希望创建同时重新读取类别列表的新活动

我目前的做法是:

备选方案包括:

  • 从活动中收听
    PlaceChangeEvent
    (然后可以使用
    FilteredActivityMapper
    CachingActivityMapper
    ActivityMapper
    中缓存活动,以便在请求时仅创建新活动)。†

  • 让某些组件侦听
    placechangevent
    s并将其转换为面向业务的事件,然后活动侦听这些事件,而不是
    placechangevent
    s,否则与上述相同

  • 将活动与“屏幕”分离,使“屏幕”成为带有
    reset()
    方法的单例,并从活动的
    start
    调用该方法(在本例中可能将类别ID作为参数传递)。“屏幕”是一个单件,因此可以确保只加载一次类别列表

  • 在您的情况下,您也可以简单地将类别列表放在共享缓存中,这样您就不必重用您的活动,因为您可以创建一个新的,类别列表将被检索一次并放入缓存中,后续的活动实例将只使用缓存中的内容。这与上面的类似,但更简单,并且缓存可以由应用程序的其他部分使用

我个人更愿意采用你的方法(除了一个小的例外,见下文),因为这是最简单/最容易的方法。将活动与“屏幕”分离也是一种选择;GWT团队开始在费用样本中探索这种方法(使用MVP将活动责任与演示者责任分离),但遗憾的是从未完成

除此之外,我认为目前还没有出现任何最佳实践



†。我不喜欢将我的活动与它们使用的地方耦合(我也不太喜欢
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;
}