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

时间:2013-07-31 07:22:38

标签: gwt

我的问题是如何停止发射事件总线的无关事件。因为我得到了this对话框的解决方案。 但是在一个实例已初始化并尝试创建同一类的新实例的情况下它不起作用。

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

 class TestScroll extends ScrollPanel
      {
         public TestScroll(){

         }
         implemented onload()
          {
             // eventBus.addHandler code here.
           //here some preview related code
          }
             unload() method
            {
               //eventBus remove handler code
            }
      }

此预览包含一些数据,其中包含一些打开不同预览但具有相同类和不同数据结构的链接, 现在问题就像onUnload(包含删除处理程序的代码)事件没有加载,因为其他面板打开了。这并不意味着以前的面板卸载。 所以在那种情况下,两次事件处理程序注册。当一个事件被解雇时,其他事件也被解雇。

由于这个原因,预览1 数据显示正常,但在预览2 打开后,当我关闭它时,我发现预览1 =预览2

那我怎么处理这种情况呢?

根据实例的数量,每个事件都被触发。但我必须检查一些独特的文档ID与if事件本身的条件。 还有其他方法可以阻止不相关的事件发生吗?

修改

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

 }

3 个答案:

答案 0 :(得分:1)

这些是疯狂的猜测,因为没有代码和清晰的描述就很难真正回答它。

我猜你所有面板都有一个事件总线。因此,当您注册处理程序时,它将使用该一个事件总线进行注册。如果您从其中一个面板向事件总线发射事件,则所有面板都将接收该事件。

要解决此问题,您可以为每个面板创建一个新的事件总线,也可以使用event.getSource()检查是谁解雇了该事件。

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

答案 1 :(得分:0)

您可以使用GwtEventService-Library通过唯一域触发特定事件,然后在此域注册的每个接收者都会收到该事件。您可以根据需要处理任意数量的不同事件/域。

答案 2 :(得分:0)

为了删除附加到EventBus的处理程序,必须首先存储对addHandler方法返回的HandlerRegistration的引用:

HandlerRegistration hr = eventBus.addHandler(new ClickHandler(){...});

然后您可以使用removeHandler方法删除处理程序:

hr.removeHandler();

值得一提的最后一点是,当使用单一视图时,就像MVP和GWT活动和场所一样,最佳做法是使用ResettableEventBus。 eventBus传递给一个活动的start()就是这样一个总线。当ActivityManager停止活动时,它会自动删除附加到ResettableEventBus的所有处理程序。

我强烈建议您阅读GWT项目的文档: