google-closure - 在自定义对象上实现 EventTarget

标签 google-closure dart

使用闭包库,您可以让任何对象能够调度扩展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/

相关文章:

javascript - 谷歌闭包 : Passing 'this' into window. setInterval

javascript - 第二次引用时变量会丢失值

flutter - 复杂梯度

dart - 枚举可以在 AngularDart 模板中使用吗?如何?

flutter - 检测 Scrollable 小部件是手动滚动还是以编程方式滚动

javascript - Javascript 社区是否有依赖项检索(如 maven 或 gem)?

javascript - 关闭: option to require var before new JS variables

javascript - Google-closure : What's the difference between Goog. 提供与 Goog.require

dart - 为什么我不能使用匿名函数返回颜色值?

flutter - 为什么 BehaviorSubject 总是返回空值?