Gam*_*mbo 8 gwt event-handling
我有一个关于GWT中客户端事件处理的问题.
在我们的应用程序中,我们有一个非常复杂的不同模块和页面结构,它们通过客户端的gwt事件总线进行通信.现在,我的观点,事件的数量正在快速增长.我正在打开一个我需要的弹出窗口:
在EventBus实现中,我是否想要复杂或遗漏一些东西?当你面临同样的问题时,我只是想从社区中得到一些反馈.
Ste*_*e J 10
为了它的价值,我有很多活动,而且还在增长.是的,我想知道我能用更少的东西做,但是当我跳过一个事件并直接链接元素时,我后悔了.
这是我昨天刚刚修好的一个例子.我有一个DataGrid小部件.我还支持使用弹出对话框重新排序列,隐藏列,重新调整列大小和着色列.单击配置按钮,显示列出的列的弹出窗口,用户可以单击复选框以显示或隐藏列,单击上移/下移按钮以重新排序列,等等.在弹出窗口中点击Apply,弹出窗口消失,DataGrid重新配置.
除了它没有.你点击Apply然后弹出窗口只是坐在那里,用户会想知道发生了什么,DataGrid会在下面重新配置,然后弹出窗口就会消失.我们只谈了很短的时间 - 可能是一秒钟或者更多一点 - 但它是如此引人注目.为什么会这样?因为我懒得将popup直接绑定到configure按钮,并将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());
}
});
Run Code Online (Sandbox Code Playgroud)
对于事件(在这种情况下,当用户单击"帮助"菜单项时触发事件):
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我有一个叫做Mediator的单例,其中注册了所有事件:
MenuHelpEvent.register(BagOfState.getInstance().getCommonEventBus(),
new MenuHelpEvent.Handler() {
@Override
public void doMenuHelp() {
new MenuHelp().execute();
}
});
Run Code Online (Sandbox Code Playgroud)
每个事件都与Command对象配合以完成工作:
public class MenuHelp implements Command {
@Override
public void execute() {
new InfoMessage(BagOfState.APP_MSG.unimplementedFeatureCaption())
.setTextAndCenter(BagOfState.APP_MSG.unimplementedFeature());
}
}
Run Code Online (Sandbox Code Playgroud)
一切都解耦了.菜单小部件绑定到执行然后完成的命令.该命令在总线上触发事件然后完成.该事件触发Command的执行并完成.命令显示弹出帮助面板(在这种情况下,向用户显示"未实现"消息 - 是的,我很快就会知道).与用户输入的每次交互都可以非常快速地处理并解决.它可以启动一系列事件来执行长时间的操作,但从不占用GUI来执行此操作.当然,由于元素是分离的,我可以在其他地方调用相同的元素(例如,通过按钮按钮和菜单项调用help命令).