数少ない Signals の日本語ドキュメントをヒム・カンパニー 永井さんが作成されていました。
http://www.himco.jp/articles.php
このドキュメントは DevelopRIA の 2010-10-18 の記事 An introduction to AS3 Signals の翻訳になります。
単なる翻訳だけでは無く永井さんの訳注付きのスグレものです。
いつもいつも大変感謝しています。
ActionScript 3 で避けて通れないのが addEventListener, removeEventListener, dispatchEvent
だと思います。
しかし、すこぶるめんどくさい。
カスタムイベントを作成する時は、Eventサブクラスを作りEvent定数を作り….などなど儀式にならって初めて使えるようになります。
また、リスナー関数に渡される引数はEventインスタンスになるので独自の値を送る時には別の方法を考えなければなりません。
昨日この点に関して、野中先生がTweetされていらっしゃいました。
http://twitter.com/FumioNonaka/status/50847301408796672
野中先生のサイトで詳しく解説されています。
私にはかなり難解です。
Adobe Flash非公式テクニカルノート:リスナー関数が使う値を外から指定する
これもSignalsなら簡単に実現できます。
引数には好きなものを指定することができます。
もちろんオリジナルのEventインスタンスを指定することも可能です。
また、SignalsでのカスタムイベントではEvent.typeは必要がありません。
これってかなり便利だと思います。
永井さん翻訳のドキュメントでようやく理解できたのは DeluxeSignal と Signal の違いです。
ドキュメントには次のように書かれています。
DeluxeSignal を使用するとターゲットにアクセスできますが、とりわけ重要なのが Signal そのものにもアクセス できるようになるということです。われわれは今後その両方が操作できるようになるのです。もちろん DeluxeSignal にも基本的な Signal の全機能が備わっています。
訳者注: DeluxeSignal のコンストラクタには、値クラスに加え、ターゲット(target)が指定できます。DeluxeSignal イ ンスタンスは指定されたターゲットに代わって、イベントを送出します。 DeluxeSignal(target:Object = null, … valueClasses)
GenericEvent は IEvent インターフェイスを備えるイベントクラスで、public プロパティとして bubbles や curretTarget、target のほか signal(イベントを送出したシグナル)を持っています。
さらにポイントになるのが GenericEvent
です。
サンプルコードでは次のように使われています。
package insideria.deluxeSignal { import org.osflash.signals.DeluxeSignal; import org.osflash.signals.events.GenericEvent; public class AlarmClock { public var alarm:DeluxeSignal; public var message:String; public function AlarmClock() { alarm = new DeluxeSignal(this); message = "This is a message from our AlarmClock"; } public function ring():void { alarm.dispatch(new GenericEvent()); } } } package insideria.deluxeSignal { import org.osflash.signals.events.GenericEvent; import flash.display.Sprite; public class WakeUp extends Sprite { private var alarmClock:AlarmClock; public function WakeUp() { alarmClock = new AlarmClock(); alarmClock.alarm.add(onRing); alarmClock.ring(); } private function onRing(event:GenericEvent):void { trace(event.target); trace(event.signal); trace(event.target.message); } } } |
GenericEventインスタンスからSignalインスタンスにアクセス可能になります。
これでSignalをaddするClass内でSignalインスタンスを保持する必要がありません。
またtargetプロパティからdispatchインスタンスのプロパティにアクセスできるのも魅力です。
Signalsはgithubからダウンロード可能です。
https://github.com/robertpenner/as3-signals