GWT MVP更新地方变更的活动状态

Mar*_*ila 6 mvp gwt gwt-mvp gwt-activities gwt-places

在地方变更上更新活动状态的最佳做法是什么?想象一下,您有一个带有视图的活动,该活动显示类别列表和类别中的项目列表.如果选择了不同的类别,则应用程序将转到具有类别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;
    }

    ...
Run Code Online (Sandbox Code Playgroud)

Tho*_*yer 5

替代方案是:

  • PlaceChangeEvent从活动中S(然后你可以用FilteredActivityMapperCachingActivityMapper用于高速缓存活动在你的ActivityMapper,所以,它的减少到只有当问创建一个新的活动).†

  • 有一些组件听取PlaceChangeEventS和翻译他们面向企业的活动,活动然后侦听到这些事件,而不是PlaceChangeEventS,否则上面一样.

  • 将活动与"屏幕"分离,使用一个reset()方法使"屏幕"成为单例,并从活动中调用该方法start(在这种情况下可能将类别ID作为参数传递).然后,作为单身人士的"屏幕"可以确保仅加载类别列表一次.

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

我个人宁愿选择你的方法(有一个小例外,见下文),因为它是最简单/最简单的.将活动与"屏幕"分离也是一种选择; GWT团队开始在费用样本中探索这种方法(将活动责任与主持人责任与使用MVP分离),而不幸地完成它.

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


†.我不喜欢将我的活动与他们使用过的地方联系起来(我不太喜欢goTo呼叫的耦合,但还没有找到一个干净简单的替代方案),所以我宁愿不去有这个选项; 同样地,我不会refresh像你那样将地点传递给活动构造函数和方法,而是将信息提取出来并将其传递给活动(例如,在你的情况下,只给活动提供类别ID,不是ItemListPlace实例;我会简单地调用setCategory所有情况,甚至不将类别ID传递给构造函数).