2

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

4

2 に答える 2

2

これは複数の方法で行うことができます。1 つの方法は、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 に答える
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 に答える