GWT事件处理最佳实践

GWT事件处理最佳实践,gwt,event-handling,Gwt,Event Handling,我有一个关于GWT中客户端事件处理的问题 在我们的应用程序中,不同模块和页面的结构非常复杂,它们通过客户端的gwt事件总线进行通信。在我看来,现在事件的数量正在快速增长。例如,我正在打开一个弹出窗口,我需要: 打开弹出窗口的事件 在客户端内询问某些数据的事件 用于获取数据并填充对话框的事件 关闭弹出窗口的事件 用于处理“保存”按钮的事件 我是否认为EventBus实现有点复杂或遗漏了什么?我只是想从社区中得到一些反馈,因为你们正面临着同样的问题。值得一提的是,我有很多活动,而且越来越多。是的,我

我有一个关于GWT中客户端事件处理的问题

在我们的应用程序中,不同模块和页面的结构非常复杂,它们通过客户端的gwt事件总线进行通信。在我看来,现在事件的数量正在快速增长。例如,我正在打开一个弹出窗口,我需要:

  • 打开弹出窗口的事件
  • 在客户端内询问某些数据的事件
  • 用于获取数据并填充对话框的事件
  • 关闭弹出窗口的事件
  • 用于处理“保存”按钮的事件

  • 我是否认为EventBus实现有点复杂或遗漏了什么?我只是想从社区中得到一些反馈,因为你们正面临着同样的问题。

    值得一提的是,我有很多活动,而且越来越多。是的,我想知道我是否可以用更少的钱,但是当我跳过一个事件并直接链接元素时,我很后悔

    这是一个我昨天刚刚解决的例子。我有一个DataGrid小部件。我还支持通过弹出对话框对列进行重新排序、隐藏列、调整列大小以及为列着色。单击“配置”按钮,将显示一个包含列出的列的弹出窗口,用户可以单击复选框以显示或隐藏列,单击上移/下移按钮以重新排列列,等等。点击弹出窗口上的Apply,弹出窗口消失,DataGrid重新配置

    但事实并非如此。你点击Apply,弹出窗口就在那里,用户会想知道发生了什么,DataGrid会在下面重新配置,然后弹出窗口就会消失。我们只谈了很短的时间——也许是一秒钟或更长一点——但它是如此引人注目。为什么会这样?因为我变得懒惰,将弹出窗口直接绑定到configure按钮,将Apply按钮直接绑定到DataGrid。例如,您点击Apply,就会使用新的配置信息调用DataGrid。只有当呼叫返回时,弹出窗口才会被拆除

    当我这么做的时候,我知道这很糟糕,但是我太懒了。因此,我花了20分钟在我的中介程序singleton中编写了两条消息和相关的处理程序。DataGrid发出一条消息以启动配置对话框,弹出窗口发出一条消息以配置DataGrid。现在,这些小部件是解耦的,性能更加快速。没有“粘性”的感觉

    现在来举个例子,你能不能把(1)和(2)结合起来?以及(3)、(4)和(5)?当用户单击我的应用程序上的“配置”按钮时,事件会附带当前配置信息(包括对发起请求的DataGrid的引用)。您可以将此信息称为“有效负载”。当用户单击弹出窗口上的Apply按钮时,事件负载包括事件处理程序在处理事件时向目标数据网格提供的所有新配置信息(包括对原始目标数据网格的引用)。两个事件——一个启动配置,一个应用最终结果

    是的,任何应用程序中都有大量的事件可以做一些有趣的事情,但是事件可以承载很多信息,所以我会看看你的事件组织是否过于分散


    另外,这里是我使用的代码。我无耻地从谷歌的一个例子中复制了这种模式的元素

    用户可以使用以下菜单项寻求帮助:

    @UiField
    MenuItem help;
    
    help.setCommand(new Command() {
          @Override
          public void execute() {
            BagOfState.getInstance().getCommonEventBus().fireEvent(new MenuHelpEvent());
          }
        });
    
    public class MenuHelpEvent extends GwtEvent<MenuHelpEvent.Handler> {
    
      private static final Type<Handler> TYPE = new Type<Handler>();
    
      public interface Handler extends EventHandler {
        void doMenuHelp();
      }
    
      @Override
      public GwtEvent.Type<Handler> getAssociatedType() {
        return TYPE;
      }
    
      @Override
      protected void dispatch(Handler handler) {
        handler.doMenuHelp();
      }
    
      public static HandlerRegistration register(EventBus eventBus, Handler handler) {
        return eventBus.addHandler(TYPE, handler);
      }
    
    }
    
    对于事件(在本例中,当用户单击“帮助”菜单项时触发的事件):

    每个事件都与一个命令对象匹配以执行此工作:

    public class MenuHelp implements Command {
    
          @Override
          public void execute() {
            new InfoMessage(BagOfState.APP_MSG.unimplementedFeatureCaption())
                .setTextAndCenter(BagOfState.APP_MSG.unimplementedFeature());
          }
    
        }
    

    一切都是解耦的。菜单小部件绑定到执行然后完成的命令。该命令在总线上触发事件,然后完成。事件触发命令的执行并完成。该命令显示弹出式帮助面板(在本例中,向用户显示一条“未实现”消息——是的,我很快就会看到)。每一次与用户输入的交互都会得到极快的处理和解决。它可以启动一系列事件来执行一个长动作,但决不会占用GUI来执行。当然,由于元素是解耦的,我可以在其他地方调用相同的元素(例如,通过按下按钮和菜单项调用帮助命令)。

    这是一个很好的建议,我会坚持下去。我一直在寻找如何用类似“事件处理”的解决方案来解决这个问题,这里我们有一个很好的例子。非常感谢。
    public class MenuHelp implements Command {
    
          @Override
          public void execute() {
            new InfoMessage(BagOfState.APP_MSG.unimplementedFeatureCaption())
                .setTextAndCenter(BagOfState.APP_MSG.unimplementedFeature());
          }
    
        }