我有一个Errai应用程序,CDI事件没有解雇:
@Dependent
@Templated
@Page(path = "person")
public class PersonPage extends Composite {
@Inject
@Loaded
Event<Person> loadedEvent;
@PageShowing
public void showing() {
Browser.getWindow().getConsole().log("Firing event..."); // works fine
loadedEvent.fire(new Person());
}
public void loaded(@Observes @Loaded Person person) {
Window.alert("Fired");
}
}
我认为这段代码非常简单,我想知道为什么它没有解雇。
答案 0 :(得分:4)
您的活动未收到,因为它是原生JS类型。问题在于,Errai的Event
实现基于该事件类型的Class
对象进行调度。这适用于普通类甚至非本机JS类型。但是原生的JS类型实际上并没有在运行时拥有类;编译器用JavaScriptObject.class
替换任何引用。
在观察者方面,Errai生成的代码根据在编译时计算出的类名来注册观察者方法。
因此存在不匹配,即使看起来您的事件正在为Person
事件触发,但实际上正在为JavaScriptObject
的观察者发送它。