如何使用GWT EventBus?

49

我想知道如何使用EventBus,或者是否有更好的解决方案来在项目中发送Event

Widget1拥有一个Button。 当我按下按钮时,Widget2Label应该更改。 这些小部件位于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); 
}
1个回答

105
当你将项目分解为逻辑部分(例如使用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());

当触发事件时,我该如何发送一个对象?在我的情况下,我需要发送一个包含用户信息的类。 - elvispt
8
你可以在自定义事件中添加一个字段,并通过构造函数进行设置,例如:'new AuthenticationEvent(someObject)'。 - Peter Knego
1
专业提示:使用gwteventbinder来最小化定义新事件所需的代码。对于上面的AuthenticationEvent,您的事件只需要扩展GenericEvent即可。 - Igor Klimer
1
最好使用“ResettableEventBus”,而不是拥有一个全局事件总线,该总线在“Presenter”生命周期结束后不会被销毁,并可能导致一个事件的多个相同事件处理程序。 - Baris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接