【问题标题】:How to use the GWT EventBus如何使用 GWT EventBus
【发布时间】:2011-05-17 11:38:04
【问题描述】:

我想知道如何使用EventBus,或者是否有更好的解决方案可以通过项目发送Event

Widget1 有一个ButtonWidget2 有一个 Label,当我按下按钮时它应该会改变。这些小部件位于DockLayout

RootLayoutPanel rootLayoutPanel = RootLayoutPanel.get();
DockLayoutPanel dock = new DockLayoutPanel(Unit.EM);

dock.addWest(new Widget1(), 10);
dock.add(new Widget2());

rootLayoutPanel.add(dock);

我在Widget1 中声明了一个handleClickAlert

@UiHandler("button")
void handleClickAlert(ClickEvent e) {
    //fireEvent(e); 
}

【问题讨论】:

    标签: java events gwt event-handling


    【解决方案1】:

    当您将项目划分为逻辑部分时(例如使用 MVP),不同的部分有时需要进行通信。典型的这种通信是通过发送状态变化来完成的,例如:

    • 用户登录/注销。
    • 用户直接通过 URL 导航到页面,因此需要更新菜单。

    在这些情况下使用事件总线是很合乎逻辑的。

    要使用它,您需要为每个应用实例化一个 EventBus,然后所有其他类都会使用它。要实现这一点,请使用静态字段、工厂或依赖注入(在 GWT 的情况下为 GIN)。

    以您自己的事件类型为例:

    public class AppUtils{
    
        public static EventBus EVENT_BUS = GWT.create(SimpleEventBus.class);
    }
    

    通常您还会创建自己的事件类型和处理程序:

    public class AuthenticationEvent extends GwtEvent<AuthenticationEventHandler> {
    
    public static Type<AuthenticationEventHandler> TYPE = new Type<AuthenticationEventHandler>();
    
      @Override
    public Type<AuthenticationEventHandler> getAssociatedType() {
        return TYPE;
    }
    
    @Override
    protected void dispatch(AuthenticationEventHandler handler) {
        handler.onAuthenticationChanged(this);
    }
    }
    

    和处理程序:

    public interface AuthenticationEventHandler extends EventHandler {
        void onAuthenticationChanged(AuthenticationEvent authenticationEvent);
    }
    

    然后你这样使用它:

    AppUtils.EVENT_BUS.addHandler(AuthenticationEvent.TYPE, new AuthenticationEventHandler()     {
            @Override
            public void onAuthenticationChanged(AuthenticationEvent authenticationEvent) {
                // authentication changed - do something
            }
        });
    

    并触发事件:

    AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent());
    

    【讨论】:

    • 触发事件时,如何发送对象?在我的情况下,我需要发送一个包含我的用户信息的类。
    • 你可以在你的自定义事件中有一个字段并通过构造函数设置它,即'new AuthenticationEvent(someObject)'
    • 专业提示:使用gwteventbinder 来最小化定义新事件所需的代码。对于上面的 AuthenticationEvent,您的事件只需必须扩展 GenericEvent
    • 最好使用“ResettableEventBus”,不要让全局事件总线在“Presenter”生命周期后不会被杀死,并且可能会导致一个事件的多个相同事件处理程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多