GWT MVP 在地点更改时更新事件状态

标签 gwt mvp gwt-mvp gwt-places gwt-activities

在地点更改时更新事件状态的最佳做法是什么?假设您有一个带有 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 来自事件(然后您可以使用 FilteredActivityMapperCachingActivityMapper 将事件缓存在您的 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/

    相关文章:

    GWT根布局面板: This widget's parent does not implement HasWidgets

    gwt - 事件处理程序不会被删除

    java - 通过单击按钮删除 Vaadin 表格项目

    java - eclipse 中的 GWT 项目

    android - 如何使用 3rd 方 SDK 遵循 MVP 架构?

    c# - C# 中具有多个 View (或分层 View )的模型 View 演示器

    gwt - 将不同 GWT 事件所需的状态放在哪里?

    google-chrome - 通过从本地环境加载 SourceMaps 在生产环境中调试 GWT 应用程序

    eclipse - 是否可以将 Google 插件安装到 Eclipse 4.x?

    jsf - 为什么 JSF 被认为是 MVP 而不是 MVVM 框架