使用闭包库,您可以让任何对象能够调度扩展goog.events.EventTarget
的事件。 。目前可以使用 Dart 库实现这一点吗?
我想它会是这样的:
#import('dart:html');
class Foo implements EventTarget {
Events get on() {
// ???
}
}
main() {
Foo foo = new Foo();
// Subscribe to the event.
foo.on['bar'].add((Event event) => print('bar!'));
// Dispatch the event.
foo.on['bar'].dispatch(new Event('bar'));
}
我走在正确的道路上吗?
编辑 感谢 Lars Tackmann,工作草案如下:http://try.dartlang.org/s/f6wk
最佳答案
您可以通过多种方式执行此操作,其中一种方法是使用 typedef 来定义通用处理程序函数:
class Event {
final String type;
Event(this.type);
}
typedef EventHandler(Event event);
interface EventTarget {
Map<String,EventHandler> get on();
void dispatch(Event event);
}
class Foo implements EventTarget {
Map<String, EventHandler> _handlers;
Foo() {
_handlers = new Map();
}
Map<String, EventHandler> get on() {
return _handlers;
}
dispatch(Event event) {
EventHandler handler = _handlers[event.type];
handler(event);
}
}
main() {
Foo foo = new Foo();
foo.on['bar'] = (Event event) => print('handling event ${event.type}');
foo.dispatch(new Event('bar'));
}
我为你制作了一个 DartBoard 片段 here玩玩。
您可能想尝试将 EventTarget 制作为基类,除非它会扰乱您的继承策略(在这种情况下,您可以使用工厂注入(inject)的事件总线可能更适合) )。
关于google-closure - 在自定义对象上实现 EventTarget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8624075/