如何在 Popup/DialogBox 中注销 GWT 事件总线处理程序?

How to unregister GWT eventbus handlers in a Popup/DialogBox?

我有一个对话框,其中包含一个按钮和一个 TabLayoutPanel。该按钮位于 TabLayoutPanel 之外。选项卡内容是单独的自定义小部件。

问题:我想通过在其中一个选项卡内容小部件中执行一个操作来响应对按钮的点击。

我试过以这种方式使用 GWT EventBus:

  1. 单击按钮时触发事件
  2. 在选项卡中添加此事件的处理程序

但问题是:如果我多次 close/open 选项卡,事件处理程序将再次注册。当单击按钮时,事件处理程序将启动多次(对于每个处理程序 registration/however 多次打开选项卡)。

由于我的对话框没有 activity/place,我无法使用 GWT 的 Activity.start(... EventBus eventBus) 自动 activity 注销。

一种可能的解决方案是在我离开该选项卡时手动记住注册的 HandlerRegistration(s) 和 .removeHandler() 它们。但这是一个相当丑陋的解决方案。

问题:有没有办法在不记住事件的情况下注销对话框中的事件?

没有代码很难给出具体的答案,但我会这样做:

  1. 打开 Popup/Dialog 时将 ClickHandler 添加到按钮。
  2. 如果单击此按钮,请检查哪个选项卡处于活动状态并调用该选项卡中的小部件的特定方法。 getSelectedIndex()getWidget(index) 应该是 TabLayoutPanel 上的方法,用于确定哪个小部件是活动小部件。
  3. 在 Popup/Dialog 关闭后取消注册 clickhandler。

这样一来,您只有一个 Handler 来移除应该是正常方式的内容,例如使用 DialogBox 的 onClose() 事件。