0

我有一个使用 EventBus 调度应用程序范围事件的应用程序。出于某种原因,如果我调用一个事件,然后尝试在触发第二个事件之前立即注册处理程序,它不会被调度。有没有其他方法可以在 event 上动态注册处理程序?请看下面的代码:

我的条目.java

package com.example.eventbus.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.RootPanel;

public class MyEntry 
implements EntryPoint {
    SimpleEventBus bus;
    @Override
    public void onModuleLoad() {
        bus = new SimpleEventBus();
        fireEvent1();
    }

    private void fireEvent1(){
      bus.addHandler(MyEvent1.TYPE,new MyEvent1.Handler() {

          @Override
          public void onEvent1(MyEvent1 event) {
              RootPanel.get().add(new Label("Event1"));
              fireEvent2();
          }
      });
      bus.fireEvent(new MyEvent1());
    }

    private void fireEvent2(){
        bus.addHandler(MyEvent2.TYPE,new MyEvent2.Handler() {

            @Override
            public void onEvent2(MyEvent2 event) {
                RootPanel.get().add(new Label("Event2")); //!!!!!This line is not being called
            }
        });
        bus.fireEvent(new MyEvent2());
    }
}

MyEvent1.java

package com.example.eventbus.client;

import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent;

public class MyEvent1 extends GwtEvent<MyEvent1.Handler>{
    public static Type<MyEvent1.Handler> TYPE=new Type<MyEvent1.Handler>();

    @Override
    public com.google.gwt.event.shared.GwtEvent.Type<Handler> getAssociatedType() {
        return TYPE;
    }

    @Override
    protected void dispatch(Handler handler) {
        System.out.println("dispatch Event1");
        handler.onEvent1(this);
    }

    public interface Handler extends EventHandler{
        public void onEvent1(MyEvent1 event);
    }
}

MyEvent2.java

package com.example.eventbus.client;

import com.google.gwt.event.shared.EventHandler;
import com.google.gwt.event.shared.GwtEvent;

public class MyEvent2 extends GwtEvent<MyEvent2.Handler>{
    public static Type<MyEvent2.Handler> TYPE=new Type<MyEvent2.Handler>();

    @Override
    public com.google.gwt.event.shared.GwtEvent.Type<Handler> getAssociatedType() {
        return TYPE;
    }

    @Override
    protected void dispatch(Handler handler) {
        System.out.println("dispatch Event2"); //!!!! This line is never called
        handler.onEvent2(this);
    }

    public interface Handler extends EventHandler{
        public void onEvent2(MyEvent2 event);
    }
}
4

3 回答 3

1

问题在于,当事件总线触发事件时,它会将任何添加或删除的处理程序排队,并在完成时处理它们。这个想法是,如果您只是在另一个事件仍在进行时才开始收听某些内容,那么您对这一轮事件不感兴趣,而是对下一轮感兴趣。删除处理程序时也会发生同样的事情 - 您仍然会听到仍在发生的事件,但在事件总线完成触发后,它将处理删除。

尝试更改代码以在触发任何事件之前连接两个处理程序,然后尝试将一个事件触发到另一个事件。

于 2014-01-09T20:54:05.357 回答
0

让我建议尝试一下gwtquery中称为“自定义事件”的新功能。

我们在最近的 GWT.create 会议中介绍了新的事件机制,看看这张幻灯片(使用箭头在幻灯片之间移动)。

您可以将自定义事件附加到 DOM 树、小部件和窗口元素中的任何元素。

然后,您可以从代码中的任何点触发事件,并且每个具有此自定义事件名称的处理程序都将被执行。

除了更简单之外,gQuery 方法的主要目标是它的性能明显优于 gwt 事件总线,因为本机浏览器以低级方式选择要执行的处理程序,而不是使用 javascript 循环列表并执行处理程序依次。

于 2014-01-09T21:06:13.397 回答
0

您可能想查看GWTP @ProxyEvent

那么什么时候应该使用@ProxyEvent?基本上,每次事件应该能够“唤醒”您的演示者时,您都会使用它。也就是说,只要在事件第一次实例化之前就应该通知演示者。

于 2015-11-05T03:19:12.600 回答