存档

文章标签 ‘as3signals’

as3signals tutorial

2010年2月26日 ColorHook 没有评论

用于Flash平台的开源事件模型as3signals目前在开源社区逐步升温,我在之前的一篇Blog中也略有提到了它诞生的历史原因。如今,许多著名的Flash框架开始与as3signals联姻,这里是它们的一些结合体:

跟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

开源的事件模型as3signals

2009年12月16日 ColorHook 1 条评论

事件驱动能够简化程序中消息传递的复杂性,为应用中的各个模块解耦,而且也便于理解和使用。作为DOM Events规范的一个实现,ActionScript 3.0的事件模型有很多值得学习、研究和讨论的地方。相对于AS2中的监听器来讲,它也更让人通俗易懂(如果你还记得以前的addListener和addEventListener的话)。

但是,当前的事件模型依然有很多让人不满意的地方。Robert Penner有几篇Blog对此进行了深入的描述:
My Critique of AS3 Events - Part 1
AS3 Events - 7 things I’ve learned from the community
My Critique of AS3 Events - Part 2 - The Dispatchening

以下是其中的部分抱怨:

事件的名称让人困惑

事件的名称看起来有些是过去式,有些是现在式,这容易让人搞混。更不可思议的是有的过去式代表的事情却实际上还没有发生,比如Event.REMOVED,其本意是一个显示对象将被移除时触发改事件

flash.events.EventDispatcher难用
  1. EventDispatcher没有类似removeAllEventListeners()的方法,这让清除监听器变得复杂。
  2. EventDispatcher难以扩展,我们继承EventDispatcher却没有任何受保护的属性,也没有任何受保护的方法可以调用。
  3. 如果不借助EventDispatcher,我们不可能实现接口IEventDispatcher

于是,Robert Penner开发了自己的事件机制as3signals。as3signals目前还在不断完善之中,开源社区的反响也十分强烈,其Google Group的地址是http://groups.google.com/group/as3-signals

as3signals从C# events和Qt中的Signals/Slots得到灵感。如果你厌倦了EventDispatcher,请试试as3signals,我的意思不是说as3signals只是个备选方案,客观的讲,它真的很优秀。