2

使用闭包库,您可以赋予任何对象分派扩展事件的能力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

4

2 回答 2

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
于 2011-12-24T23:15:26.343 回答
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 片段供您使用。

您可能想尝试将EventTarget变成一个基类,除非它弄乱了您的继承策略(在这种情况下,您可以使用工厂注入的事件总线可能更合适)。

于 2011-12-25T12:31:49.477 回答