Gwt 如何停止触发事件总线的无关事件

Gwt 如何停止触发事件总线的无关事件,gwt,Gwt,我的问题是如何停止触发事件总线的无关事件。当我得到对话框的解决方案时。 但当一个实例已经初始化并尝试创建同一类的新实例时,它就不起作用了 示例:下面的滚动面板已初始化处理程序。它用于文档预览 class TestScroll extends ScrollPanel { public TestScroll(){ } implemented onload() { // eventBus

我的问题是如何停止触发事件总线的无关事件。当我得到对话框的解决方案时。 但当一个实例已经初始化并尝试创建同一类的新实例时,它就不起作用了

示例:下面的滚动面板已初始化处理程序。它用于文档预览

 class TestScroll extends ScrollPanel
      {
         public TestScroll(){

         }
         implemented onload()
          {
             // eventBus.addHandler code here.
           //here some preview related code
          }
             unload() method
            {
               //eventBus remove handler code
            }
      }
此预览有一些数据,其中包含打开不同预览但具有相同类和不同数据结构的链接, 现在的问题类似于onUnload(,其中包含删除处理程序的代码)事件没有加载,因为其他面板已打开。这并不意味着以前的面板卸载。 所以在这种情况下,注册了两次事件处理程序。当一个事件被激发时,另一个事件也被激发

因此,Preview 1数据正确显示,但在打开Preview 2后,当我关闭它时,我发现Preview1=Preview2

那么我该如何处理这种情况呢

根据已创建的实例数,触发每个事件。但我必须用事件本身的if条件检查一些唯一的文档id。 有没有其他方法来停止不相关的事件触发

编辑:

public class Gwteventbus implements EntryPoint {

  int i=0;
  @Override
  public void onModuleLoad() {
   TestApp panel=new TestApp();

   Button button=new Button("Test Event");
   button.addClickHandler(new ClickHandler() {

   @Override
   public void onClick(ClickEvent event) {
        TestApp panel=new TestApp();
        int j=i;
        new AppUtils().EVENT_BUS.fireEventFromSource(new AuthenticationEvent(),""+(j));
        i++;

   }
   });
   panel.add(button);
   RootPanel.get().add(panel);
   }        
}
public class AppUtils {
    public static EventBus EVENT_BUS = GWT.create(SimpleEventBus.class);
 }
 public class TestApp extends VerticalPanel{
  String testString="";
   public TestApp( ) {
    AppUtils.EVENT_BUS.addHandler(AuthenticationEvent.TYPE, new AuthenticationEventHandler()     {
     @Override
     public void onAuthenticationChanged(AuthenticationEvent authenticationEvent) {
        System.out.println("helloworld"+authenticationEvent.getSource());
    }
  });
   }

 }

您可以使用在唯一域上触发特定事件,在该域注册的每个接收器都会接收该事件。您可以处理任意多个不同的事件/域。

要删除连接到EventBus的处理程序,必须首先存储对addHandler方法返回的HandlerRegistration的引用:

HandlerRegistration hr = eventBus.addHandler(new ClickHandler(){...});
hr.removeHandler();
然后可以使用removeHandler方法删除处理程序:

HandlerRegistration hr = eventBus.addHandler(new ClickHandler(){...});
hr.removeHandler();
值得一提的最后一点是,当使用单例视图时(如MVP和GWT活动和场所的典型视图),最好使用ResettableEventBus。传递给活动的start()的eventBus就是这样一个总线。当ActivityManager停止活动时,它会自动删除连接到ResettableEventBus的所有处理程序

我强烈建议阅读GWT项目关于以下方面的文档:


    • 这些都是胡乱猜测,因为如果没有代码和清晰的描述,很难真正回答

      我猜所有面板都有一个eventbus。因此,当您注册一个处理程序时,它将注册到该事件总线。如果您从其中一个面板向eventbus触发事件,所有面板都将接收该事件

      要解决此问题,您可以为每个面板创建一个新的eventbus,或者使用
      event.getSource()
      检查是谁触发了事件


      如果这没有意义,您可能正在重用一个变量或使用一个静态变量,它实际上应该是一个新实例或非静态变量。

      我不确定是否理解您的问题,部分原因是您发布了伪代码。如果你的问题是由于某些特定的不正确使用,我们永远不会发现,因为我们必须猜测。如果您想要一个有用的答案,请提供一些真实的代码,包括onload/onUnload、注册什么事件、如何触发事件以及如何创建预览对象。确定。由于企业应用,我无法发布原始代码。我可以放一个测试用例样本。仅举一个例子,
      如果任何面板都注册了事件总线处理程序,那么您就知道创建的实例数不超过初始化的事件总线数。如果触发任何一个事件,则调用所有事件处理程序。因此,我只想一次触发一个事件,该事件仅与相关面板相关。
      是否有任何方法可以识别同一类中多个瞬间的事件?只需示例编辑问题,我就创建了一个示例测试用例。请参阅
      TestApp
      创建了多个实例,然后它将针对所有事件启动。是否可以使事件处理程序特定于实例?只要面板激发到全局事件总线,每个人都会得到它。如果面板注册了特定类型的事件,那么它将在触发时获取该类型的所有事件。通过识别是谁触发了事件或在事件中设置值以识别特定事件,您可以在触发事件时检查事件。在您的示例中,一个可能的解决方案是将i(或j)作为参数传递给
      TestApp
      的构造函数,或者可以将
      panel
      作为火源而不是int值传递给int变量。我并不是说这是最好的解决方案,但给出了一个例子,它是可能的解决方案。是的,我使用了这个变量
      I
      j
      ,用于测试目的。谢谢,我认为这个解决方案已经存在了……但是pass
      面板
      ,这意味着我必须通过获取它的实例来手动设置所有小部件的值,因为在java上下文中,我们可以将类
      分配给这个
      ,并使用其他实例。像
      this=panel