0

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

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

 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数据显示正确,但在Preview2打开之后,当我关闭它时,我发现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());
    }
  });
   }

 }
4

3 回答 3

1

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

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

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

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

于 2013-08-01T19:36:22.240 回答
0

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

于 2013-07-31T14:24:00.933 回答
0

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

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

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

hr.removeHandler();

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

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

于 2013-08-01T00:31:17.933 回答