2008年3月26日水曜日

as3の安易なカスタムイベント

as3でイベントを起動するには、通常

this.dispatchEvent(new Event(Event.COMPLETE));

のようにイベントタイプをクラス定数で渡すという お行儀の良い方法をとる。

でもas2のようにおきらくにカスタムイベントを使いたい。 で、

this.addEventListener('hoge', this.onHoge);

として

this.dispatchEvent(new Event('hoge'));

と任意の文字列でイベントタイプを渡すこともできるが イベントタイプの識別は文字列であって どのイベントクラスの定数かまでは考慮されないので

this.addEventListener('complete', this.onComplete);

とカスタムイベントをセットしているつもりでも イベントタイプがthisの組み込みのものと一致すると 予期しないタイミングで組み込みイベントEvent.COMPLETEが発生してしまい 危険。

とにかく 安全にカスタムイベントをセットするには 組み込みイベントタイプと一致しない文字列を指定しなければならない。

そこで

public class E extends Event {
  private static const PREFIX:String = 'easy_event_prefix_';

  public function E(type:String,
                      bubbles:Boolean=false,
                      cancelable:Boolean=false) {
    super(E.t(type), bubbles, cancelable);
  }

  public override function clone():Event {
    return new E(type, bubbles, cancelable);
  }

  public static function t(type:String):String {
    return E.PREFIX + type;
  }
}

のようにEventクラスを継承したEクラスなどを1つつくっておき

イベントの登録には

this.addEventListener(E.t('complete'), this.onComplete);

イベントの起動には

this.dispatchEvent(new E('complete'));

としておけば easy_event_prefix_という接頭辞がついたイベントタイプで 受け渡しが行われるので 組み込みイベントに反応することはない。

コメント(0):