2011-09-20 115 views
8

我有一个关于GWT中客户端事件处理的问题。最佳实践GWT事件处理

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

  1. 打开弹出
  2. 事件询问客户
  3. 为取回数据并填写对话框
  4. 事件中的一些数据的事件关闭弹出
  5. 事件处理保存按钮

事件我在想一点点复杂,或失去了一些东西EventBus实现?当你面临同样的问题时,我只想从社区中获得一些反馈。

回答

10

对于它的价值,我有很多事件和更多的成长。是的,我想知道我是否可以少做,但是当我跳过一个事件并直接链接元素时,我感到后悔。

这是我昨天刚刚修好的一个例子。我有一个DataGrid小部件。我还支持对列进行重新排序,隐藏列,重新调整列大小以及使用弹出对话框着色列。你点击一个配置按钮和一个列出了列的弹出窗口,用户可以点击复选框来显示或隐藏列,点击上移/下移按钮重新排列列,等等。在弹出窗口中点击应用,弹出消失,并重新配置DataGrid。

除了它没有。你点击Apply,弹出窗口就会坐在那里,用户会想知道发生了什么,DataGrid会在下面重新配置,然后弹出窗口就会消失。我们只谈了很短的时间 - 可能是一秒钟或更长时间 - 但它是如此明显。为什么发生?因为我很懒,并直接将弹出窗口绑定到配置按钮,并将Apply按钮直接绑定到DataGrid。例如,您将点击Apply,然后使用新的配置信息对DataGrid进行调用。只有当调用返回时,弹出窗口才会被拆除。

我知道这样做很糟糕,但是我很懒。所以我花了我需要的20分钟在我的中介单例中写出两条消息和相关的处理程序。 DataGrid发出一条消息来启动配置对话框,另一条消息由弹出窗口发出以配置DataGrid。现在这些小部件被拆分,性能更加快捷。没有“粘性”的感觉。

现在来看你的例子,你不能结合(1)和(2)吗?还有(3),(4)和(5)?当用户单击我的应用程序上的配置按钮时,该事件携带当前配置信息(包括对发起请求的DataGrid的引用)。您可以将此信息称为“有效载荷”。当用户单击弹出窗口上的应用按钮时,事件有效内容包括处理事件时事件处理程序提供给目标DataGrid的所有新配置信息(包括对原始目标DataGrid的引用)。两个事件 - 一个启动配置,一个应用最终结果。

是的,任何应用程序中都有很多事件可以做一些有趣的事情,但事件可以传递大量信息,所以我会考虑事件组织是否太破碎。


作为一个额外的位,这里是我使用的代码。我从Google的一个例子中无耻地复制了这种模式的元素。

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

@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); 
    } 

} 

我有一个叫做中保单中的所有事件都记录:

MenuHelpEvent.register(BagOfState.getInstance().getCommonEventBus(), 
    new MenuHelpEvent.Handler() { 
     @Override 
     public void doMenuHelp() { 
     new MenuHelp().execute(); 
     } 
    }); 

每一个事件配合与C ommand对象做的工作:

public class MenuHelp implements Command { 

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

    } 

一切都是分离的。菜单小部件绑定到一个执行并完成的命令。该命令在总线上触发事件,然后完成。事件触发了命令和完成的执行。命令显示弹出式帮助面板(在这种情况下,向用户提供“未实现”消息 - 是的,我很快就会看到)。每个与用户输入的交互处理都非常快速并得到解决。它可以启动一系列事件来执行长时间的操作,但从不捆绑GUI来执行此操作。当然,由于元素是分开的,我可以在其他地方调用相同的元素(例如,通过按钮以及菜单项调用帮助命令)。

+0

这是伟大的建议,我会尝试并坚持。 –

+0

我一直在寻找如何解决这个问题的解决方案,像'事件处理',这里我们有一个很好的例子。谢谢。 – user1445967