在自定义对象上实现EventTarget

时间:2011-12-24 10:55:40

标签: google-closure dart

使用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

2 个答案:

答案 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 放入基类中,除非因为它弄乱了您的继承策略(在这种情况下,您可以使用工厂注入的事件总线可能更适合)。