GwtEvent没有被派遣

时间:2014-01-09 20:25:04

标签: events gwt bus event-bus

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

MyEntry.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);
    }
}

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我建议您尝试使用名为“自定义事件”的gwtquery中的新功能。

我们在最近的GWT.create会议期间引入了新的事件机制,看看这个slide(使用箭头在幻灯片之间移动)。

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

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

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

答案 2 :(得分:0)

您可能需要查看GWTP @ProxyEvent

  

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