Реализация EventTarget на пользовательских объектах - PullRequest
2 голосов
/ 24 декабря 2011

Используя 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'));
}

Я на правильном пути?

Редактировать Спасибо Ларсу Такманну, работающемуЧерновик здесь: http://try.dartlang.org/s/f6wk

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

Вы можете сделать это несколькими способами, одним из способов может быть использование 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 в базовый класс, если только это не испортит вашу стратегию наследования (в этом случае шина событий, которую вы можете внедрить с фабрикой, может оказаться более подходящей) .

2 голосов
/ 25 декабря 2011

Думаю, что да, но я предпочитаю более надежную модель событий для внутренних объектов, чем ту, которая используется для переноса событий DOM в Dart. Модель, которую я использую больше после модели событий .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
...