2011-12-24 3 views
2

Используя библиотеку Closure, вы можете дать любому объекту возможность отправлять события, расширяющие goog.events.EventTarget. Возможно ли в настоящее время использовать библиотеки Dart?Реализация EventTarget на пользовательских объектах

Я предполагаю, что это будет выглядеть следующим образом:

#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

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

+0

Woah. Это выглядит намного проще, чем я думал. Спасибо за полный пример и снимок от дартс. :) Схема автобусов событий для меня нова, но я больше об этом прочитаю. – moraes

+1

Ваш фрагмент DartBoard позволяет зарегистрировать одного слушателя (см .: http://try.dartlang.org/s/8rsk). Вот версия, которая поддерживает несколько: http://try.dartlang.org/s/LBkk – moraes

2

Я думаю, что вы, но я предпочитаю более надежную модель событий для внутренних объектов, чем та, которая используется, чтобы обернуть события 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 
+0

Прямо сейчас я предпочитаю интерфейс, который находится как можно ближе к интерфейсу событий dart: html. Но ваш подход интересен, и я хочу поиграть с этим. – moraes

Смежные вопросы