1

ダーツでイベント可能な型を作成する機能が組み込まれていますか?

私の Javascript アプリケーションでは、Eventable というクラスを使用して、次の機能を提供しています。

var dog = new Dog() //where Dog inherits from Eventable
var cat = new Cat() //where Cat inherits from Eventable

//use 'on' to listen to events
cat.on(dog, 'bark', cat.runaway); //assuming Cat has a method runaway on its prototype

//use fire to launch events
dog.fire({type: 'bark'});  //this causes cat.runaway(event); to be called

javascript で非常に一般的なパターンです。オブジェクトを src と心の中で分離しておくのに役立つので、気に入っています。

onメソッドを使用すると、所有者 (上記)、クライアント (上記)、タイプ (上記)、機能 (上記)new EventContractに基づく一意のキーを持つ が作成されます。この一意のキーにより、重複したs が作成されないようにすることができますが、さらに重要なことは、オブジェクトが持つすべての s の簡単に検索できるコレクションを保持できるため、次のように呼び出すことができます。catdog'bark'cat.runawayEventContractEventContract

cat.dispose();

のすべてのイベント コントラクトcatが破棄されるため、cat へのすべての外部参照が削除され、cat を GC できるようになったと確信しています。

cat.on(dog, 'bark', cat.runaway);しかし、次のようなことを行うと、新しい関数が生成されて囲まれ、dart の標準関数オブジェクトから取得できる唯一の一意のキーはその hashCode になるため、Dart でこの機能を実装するのは難しいと思います(){cat.runaway();}が、それはつまりjavascript で発生するように、元の関数への参照を処理するのではなく、別の一意のクロージャーを作成したため、思い出すcat.on(dog, 'bark', cat.runaway);ことができ、新しいものを作成します。EventContract

ダーツでこのパターンを達成する方法はありますか?

4

1 に答える 1

7

一般に、StreamDart で一連のイベントを提供する慣用的な方法として使用する必要があります。さらに、イベントをソースで明示的に宣言することをお勧めします (たとえば、 のonBark代わりにon['bark']. 次のようなものから始める必要があります。

class Dog {
  var _barkController = new StreamController();
  Stream get onBark => _barkController.stream.asBroadcastStream();
  void bark() => _barkController.add("woof");
}

class Cat {
  void runaway() => print("cat running");
}

void main() {
  var dog = new Dog();
  var cat = new Cat();

  // listen returns subscription object which you can use to unsubscribe
  var sub = dog.onBark.listen((event) => cat.runaway()); 

  dog.bark();  // prints 'cat running'
  sub.cancel();
  dog.bark();  // doesn't print anything
}

イベントを動的に宣言したい場合は、次のようにすることができます。

  var sub = dog.on['bark'].listen((event) => cat.runaway()); 
  // in this case `on` is a property of some Events type which overrides
  // operator[] to return appropriate Stream

DOM 要素でブラウザ イベントを提供するために使用される、同様のEvents クラスが既に存在します。

さらに、このタスクを少し簡素化するコミュニティ ライブラリevent_streamevent_sourceがあります。

于 2013-05-09T16:08:04.567 に答える