如何在弹出/对话框中注销GWT eventbus处理程序?

如何在弹出/对话框中注销GWT eventbus处理程序?,gwt,event-bus,Gwt,Event Bus,我有一个对话框,其中包含一个按钮和一个TabLayoutPanel。按钮在桌子的外面。选项卡内容是独立的自定义小部件 问题是:我想通过在其中一个选项卡内容小部件中执行操作来响应对按钮的单击 我尝试以这种方式使用GWT事件总线: 单击按钮时触发事件 在选项卡内添加此事件的处理程序 但问题是:如果我多次关闭/打开选项卡,事件处理程序将再次注册。单击按钮时,事件处理程序将启动多次(对于每个处理程序注册/无论选项卡打开多少次) 由于我的对话框没有活动/位置,我无法使用GWT的activity.start

我有一个对话框,其中包含一个按钮和一个TabLayoutPanel。按钮在桌子的外面。选项卡内容是独立的自定义小部件

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

我尝试以这种方式使用GWT事件总线:

  • 单击按钮时触发事件
  • 在选项卡内添加此事件的处理程序
  • 但问题是:如果我多次关闭/打开选项卡,事件处理程序将再次注册。单击按钮时,事件处理程序将启动多次(对于每个处理程序注册/无论选项卡打开多少次)

    由于我的对话框没有活动/位置,我无法使用GWT的
    activity.start(…EventBus EventBus)
    自动取消活动注册

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


    问题:有没有办法在对话框中注销事件而不记住它们?

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

  • 打开弹出/对话框时,将ClickHandler添加到按钮
  • 如果单击此按钮,请检查哪个选项卡是活动选项卡,并在该选项卡中的小部件上调用特定方法。
    getSelectedIndex()
    getWidget(index)
    应该是TabLayoutPanel上用于确定哪个小部件是活动的小部件的方法
  • 关闭弹出/对话框后注销clickhandler
  • 通过这种方式,您只有一个处理程序可以删除正常方式应该删除的内容,例如使用对话框的
    onClose()
    事件