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

最佳答案

您可以通过多种方式执行此操作,一种方法是使用 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/

10-13 21:29