as3signals tutorial
用于Flash平台的开源事件模型as3signals目前在开源社区逐步升温,我在之前的一篇Blog中也略有提到了它诞生的历史原因。如今,许多著名的Flash框架开始与as3signals联姻,这里是它们的一些结合体:
- Robotlegs : Robotlegs, AS3-Signals and the SignalCommandMap Example
- Swiz : Swiz, AS3-Signals, and [Inject] FTW
- PureMVC : PureMVC, LICS and Signals – A Frankenstein Framework?
- Smartypants-ioc : Smartypants-ioc and As3-signals example
跟EventDispathcer相比,as3signals有更易用的接口,如add, remove, dispatch。并且它还有一些EventDispatcher没有的接口,如addOnce, removeAll。
下面看看如何使用as3signals来触发和监听事件:
public class Dispatcher{ public var signal:Signal; public function Dispatcher(){ signal=new Signal(); } } var dispatcher:Dispatcher=new Dispatcher(); dispatcher.signal.add(signalHandler); function signalHandler():void{ trace("signal dispatched"); } dispatcher.signal.dispatch();
ISignal.dispatch()支持可变参数,这意味着通信时可以传递任意数量的对象。Signal的构造函数可以指定dispatch传输的数据类型,这利于在编译期间找出潜在bug。
public class Dispatcher{ public var signal:Signal; public function Dispatcher(){ signal=new Signal(String,String); } } var dispatcher:Dispatcher=new Dispatcher(); dispatcher.signal.add(signalHandler); function signalHandler(p:String,q:String):void{ trace("signal dispatched"); } dispatcher.signal.dispatch("cool","as3Signals");
DeluxeSignal支持事件监听器的优先级以及事件的冒泡。addOnce监听的事件只会执行一次,这将为我们提供很大的便利。
var deluxeSignal:DeluxeSignal = new DeluxeSignal(this); deluxeSignal.addOnce(deluxeSignalHandler); deluxeSignal.dispatch(new GenericEvent()); deluxeSignal.dispatch(new GenericEvent()); function deluxeSignalHandler(event:GenericEvent):void { trace("deluxeSignal dispatched: ",event.target); }
NativeSignal用于结合EventDispatcher,这样原本有EventDispatcher发出的事件转交给了Signal。
var nativeSignal:NativeSignal = new NativeSignal(stage, MouseEvent.CLICK, MouseEvent); nativeSignal.add(nativeMouseHandler); function nativeMouseHandler(event:MouseEvent):void { trace("nativeMouseHandler: stage clicked"); }
除了易用的接口之外,它在性能上也表现不凡:http://alecmce.com/as3/events-and-signals-performance-tests。