在地点更改时更新事件状态的最佳做法是什么?假设您有一个带有 View 的事件,该 View 显示类别列表和类别中的项目列表。如果选择了不同的类别,则应用程序会使用类别 ID 转到新位置。然后我只想刷新项目,而不是创建也重新读取类别列表的新事件。
我目前的做法是这样的:
public class AppActivityMapper implements ActivityMapper {
private ItemListActivity itemListActivity;
...
public Activity getActivity(final Place place) {
final Activity activity;
if (place instanceof ItemListPlace) {
if (itemListActivity == null) {
itemListActivity = new ItemListActivity((ItemListPlace) place, clientFactory);
} else {
itemListActivity.refresh((ItemListPlace) place);
}
activity = itemListActivity;
} else {
itemListActivity = null;
}
...
return activity;
}
...
最佳答案
替代方案是:
PlaceChangeEvent
s 来自事件(然后您可以使用 FilteredActivityMapper
和 CachingActivityMapper
将事件缓存在您的 ActivityMapper
中,以便它减少到仅在被询问时创建新事件)。 † PlaceChangeEvent
s 并将它们转换为面向业务的事件,然后事件监听这些事件而不是 PlaceChangeEvent
s,其他同上。 reset()
使“屏幕”成为单例方法并从事件的 start
调用该方法(在这种情况下,可能将类别 ID 作为参数传递)。作为单例的“屏幕”可以确保只加载一次类别列表。 我个人更愿意采用你的方法(有一个小异常(exception),见下文),因为它是最简单/最简单的。将事件与“屏幕”解耦也是一种选择; GWT 团队开始在 Expenses 示例中探索这种方法(使用 MVP 将事件责任与演示者责任分离),但不幸的是,它从未完成。
除此之外,我认为目前还没有真正出现任何最佳实践。
†。我不喜欢将我的事件与它们使用的地方耦合(我也不太喜欢
goTo
调用的耦合,但还没有找到一个干净简单的替代方案),所以我会而不是选择这个选项;同样,我不会将位置传递给事件构造函数和 refresh
像您一样的方法,而是从该位置提取信息并将其传递给事件(例如,在您的情况下,只为事件提供类别 ID,而不是 ItemListPlace
实例;然后我会简单地调用 setCategory
在所有情况下,甚至不将类别 ID 传递给构造函数)。
关于GWT MVP 在地点更改时更新事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12073123/