如何使用GWT Widget.firevent?
我想让一个子部件触发一个事件,并让它的父部件对它做出反应。据我所知,如何使用GWT Widget.firevent?,gwt,Gwt,我想让一个子部件触发一个事件,并让它的父部件对它做出反应。据我所知,Widget.firevent就是为了这个。但以下代码不起作用: public class EntryPointClass implements EntryPoint { private final HorizontalPanel horizontalPanel = new HorizontalPanel(); public void onModuleLoad() { VerticalPanel verticalPane
Widget.firevent
就是为了这个。但以下代码不起作用:
public class EntryPointClass implements EntryPoint {
private final HorizontalPanel horizontalPanel = new HorizontalPanel();
public void onModuleLoad() {
VerticalPanel verticalPanel = new VerticalPanel();
verticalPanel.add(horizontalPanel);
horizontalPanel.setHeight("500px");
horizontalPanel.setWidth("500px");
horizontalPanel.addDomHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent clickEvent) {
log("onClick");
horizontalPanel.fireEvent(new ChangeEvent() {
});
}
}, ClickEvent.getType());
verticalPanel.addDomHandler(new ChangeHandler() {
@Override
public void onChange(ChangeEvent changeEvent) {
log("onChange");
}
}, ChangeEvent.getType());
RootPanel.get().add(verticalPanel);
}
private static native void log(String msg) /*-{
$wnd.console.log(msg);
}-*/;
}
onClick
会被打印,但onChange
不会。我做错了什么?或者我是否理解了Widget.firevent
的用途有误?该ChangeEvent
是一个DOM事件,表示浏览器从该Widget中的一个DOM元素触发了一个事件
除了GWT的内部浏览器事件连接之外,该类并不意味着要创建实例,这就是为什么在代码中需要创建它的子类才能创建实例的原因。触发这种类型的事件实际上不会导致元素发生更改,因此我不确定在这里执行此操作的目的是什么
考虑使用逻辑事件ValueChangeEvent
来指示小部件中的值已更改,尽管要正确使用,触发小部件应实现hasvaluechangeholders
最后,您从
horizontalPanel
实例触发了事件,但正在从verticalPanel
监听,因此您不会看到这种情况发生。当浏览器事件在dom元素中冒泡时(直到有东西调用它们上的stopPropagation()
),您实际上并不是在元素上触发dom事件,而是在启动小部件的包装类,因此不会发生冒泡我认为你应该考虑使用EnvestBUS。它的类专用于作为发送方和接收方之间的代理。请记住,发送事件是相当昂贵的操作。在上面这种情况下,我只会引用面板引用,而不是在它们之间发送事件。但是如果没有冒泡,那么从小部件而不是事件总线触发事件有什么意义呢?冒泡对于dom元素很有意义,因为浏览器不知道逻辑分解(即一个小部件停止,另一个小部件启动),但根据定义,小部件就是故障。如果您想广播事件,使用eventbus进行应用程序范围的通信比通过向
标记添加处理程序来监听“全局”事件更有意义。