【问题标题】:GwtEvent does not get dispatchedGwtEvent 没有被调度
【发布时间】:2014-01-09 20:25:04
【问题描述】:

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

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

【问题讨论】:

    标签: events gwt bus event-bus


    【解决方案1】:

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

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

    【讨论】:

    • 事先注册两个处理程序的问题是我必须立即实例化所有处理程序对象。我的问题是我想根据需要创建处理程序对象并即时注册它们。 “事件回合”结束时有什么触发器可以挂钩吗?
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      您可能想查看GWTP @ProxyEvent

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-15
        相关资源
        最近更新 更多