如何使用 GWT 事件总线



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

Widget1有一个Button. Widget2有一个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); 
}

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

相关内容

  • 没有找到相关文章

最新更新