如何使用 GWT EventBus

发布于 2024-11-07 22:03:13 字数 623 浏览 0 评论 0原文

我想知道如何使用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); 
}

I wonder how to use the EventBus or whether there are some better solutions to send an Event through the project.

Widget1 has a Button. Widget2 has a Label, that should change when I press the button. These widgets are in a DockLayout:

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

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

rootLayoutPanel.add(dock);

I have declared an handleClickAlert in Widget1:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

染柒℉ 2024-11-14 22:03:13

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

When you divide the project into logical parts (for example with MVP), then the different parts sometimes need to communicate. Typical this communication is done by sending status changes, e.g.:

  • user logged-in / logged-out.
  • user navigated directly via URL to a page, so the menu needs to be updated.

Using the event bus is quite logical in those cases.

To use it you instantiate one EventBus per app which is then used by all other classes. To achieve this use a static field, factory or dependency injection (GIN in case of GWT).

Example with your own event types:

public class AppUtils{

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

Normally you'd also create your own event types and handlers:

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

and the handler:

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

Then you use it like this:

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

and fire the event:

AppUtils.EVENT_BUS.fireEvent(new AuthenticationEvent());
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文