有人能给我一个创建自定义事件和处理程序集的例子吗? 假设您有一个 Person 对象,您希望您的小部件知道它是否已更新。
您创建了一个 HandlerManager,现在您必须创建一个事件和一个处理程序。 如何定义这些类,以便您可以订阅和触发事件?
大多数事件都是基于 DOM 的,而我想创建一些自定义事件和处理程序,这些处理程序可以在任何基于浏览器之外的地方触发。
有人能给我一个创建自定义事件和处理程序集的例子吗? 假设您有一个 Person 对象,您希望您的小部件知道它是否已更新。
您创建了一个 HandlerManager,现在您必须创建一个事件和一个处理程序。 如何定义这些类,以便您可以订阅和触发事件?
大多数事件都是基于 DOM 的,而我想创建一些自定义事件和处理程序,这些处理程序可以在任何基于浏览器之外的地方触发。
感谢所有回复。Zakness提供了最接近我需要的答案,但是我想出了一个稍微简单一点的模型。
我的主要目标是避免对我的主数据结构使用静态变量。我也遇到了一个问题,即在尝试访问它时如何确定该主数据结构是否成功地从数据库中检索出来以及当它为 null 时该怎么办。
在观看了 Google IO 的“Google Web Toolkit 架构:彻底掌握 GWT 应用程序的最佳实践”视频后,事件总线的理念似乎是完美的。
如果我的解决方案能够帮助其他人,我会在此发布。
首先,创建 Handler 类。请注意已经引用了 Event 类:
public interface CategoryChangeHandler extends EventHandler {
void onCategoryChange(CategoryChangeEvent event);
}
现在我们来看事件类。这是让我最为头疼的部分:
public class CategoryChangeEvent extends GwtEvent<CategoryChangeHandler> {
private final List<Category> category;
public CategoryChangeEvent(List<Category> category) {
super();
this.category = category;
}
public static final Type<CategoryChangeHandler> TYPE = new Type<CategoryChangeHandler>();
@Override
protected void dispatch(CategoryChangeHandler handler) {
handler.onCategoryChange(this);
}
@Override
public com.google.gwt.event.shared.GwtEvent.Type<CategoryChangeHandler> getAssociatedType() {
return TYPE;
}
public List<Category> getCategories(){
return category;
}
}
现在我可以这样使用Handler和Event类,当主数据结构重新加载时:
此代码已经获取了数据结构,并希望通知所有正在监听的人它已经更新:
CategoryChangeEvent event = new CategoryChangeEvent(result);
eventBus.fireEvent(event);
这段代码是事件(Event)的一个实现
public class PopulateCategoryHandler implements CategoryChangeHandler {
@Override
public void onCategoryChange(CategoryChangeEvent event) {
tearDownCategories();
List<Category> categories = event.getCategories();
populateCategories(categories);
}
}
以下是一个非常详细的自定义事件示例,直接摘自GwtEventSystem Wiki(当事件系统仍在GWT孵化器中时)。
该事件会在用户感到高兴时被触发。
定义一个新的事件类。您可以在事件类中添加任意元数据,但为简单起见,在此我们不包含任何元数据。
public class HappyEvent extends GwtEvent {
...
}
定义一个新的处理程序(handler)和标记接口(marker interface),用于事件类(event class)。
interface HappyHandler extends EventHandler {
public void onHappiness(HappyEvent event);
}
interface HasHappyEvents {
public HandlerRegistration addHappyHandler(HappyHandler handler);
}
添加一个唯一的事件类型
class HappyEvent extends AbstractEvent{
public static AbstractEvent.Key KEY = new AbstractEvent.Key(){...}
public GwtEvent.Key getKey(){
return KEY;
}
...
}
连接处理程序的fire方法
class HappyEvent extends GwtEvent {
static Key<HappyEvent,HappyHandler> KEY = new Key<HappyEvent,HappyHandler>(){
protected void fire(HappyHandler handler, HappyEvent event) {
handler.onHappiness(event);
};
...
}
yourComponent.addHandler(this, YourEvent.TYPE);
"this" 是实现你自定义处理程序接口的类。