使用Closure Library,您可以为任何对象分配扩展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
答案 0 :(得分:2)
我认为你是,但我更喜欢内部对象的一个更强大的事件模型,而不是用于在Dart中包装DOM事件的模型。我在.net事件模型之后使用的模型更多,并且允许传递源对象和携带与事件相关的数据的EventArgs类(或子类)。
https://github.com/LUCA-Studios-LLC/LUCA-UI-Framework-for-Dart/blob/master/core/FrameworkEvent.dart
看起来像:
FrameworkEvent<EventArgs> myEvent = new FrameworkEvent<EventArgs>();
//here subscribing using custom operator override "+"
var handler = myEvent + (Dynamic source, EventArgs args) {
//do stuff when the event fires here
};
//fire the event
myEvent.invoke(this, new EventArgs());
//unsubscribe using operator override "-"
myEvent - handler; //unsubscribe from the event here
答案 1 :(得分:2)
您可以通过多种方式执行此操作,一种方法可以使用 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 放入基类中,除非因为它弄乱了您的继承策略(在这种情况下,您可以使用工厂注入的事件总线可能更适合)。