flash - ActionScript 2事件的最佳实践是有一种方法来模拟 ActionScript 3样式事件?

  显示原文与译文双语对照的内容

我喜欢AS3事件模型- 它有助于保持我的代码整洁和lossely耦合。 当我曾经在AS2项目上工作时,我的代码并不那么整洁,类更依赖于彼此。 由于AS2处理范围的奇怪,我从来没有真正开始使用AS2事件系统。

因为我偶尔要在AS2工作,我的问题是:

是否有人能够在AS2中模拟AS3事件 API,如果没有,那么监听和发送事件和处理范围的最佳实践是什么?

时间:

其实这么做很简单。 有几个课程可以让你。 第一个是 Event 类,如下所示:


class com.rokkan.events.Event
{

 public static var ACTIVATE:String ="activate";
 public static var ADDED:String ="added";
 public static var CANCEL:String ="cancel";
 public static var CHANGE:String ="change";
 public static var CLOSE:String ="close";
 public static var COMPLETE:String ="complete";
 public static var INIT:String ="init";

//And any other string constants you'd like to use...

 public var target;
 public var type:String;

 function Event( $target, $type:String )
 {
 target = $target;
 type = $type;
 }

 public function toString():String
 {
 return"[Event target=" + target +" type=" + type +"]";
 }
}

然后,我使用另外两个基类。 一个用于常规对象,另一个用于需要扩展 MovieClip的对象。 首先是非 MovieClip 版本。


import com.rokkan.events.Event;
import mx.events.EventDispatcher;

class com.rokkan.events.Dispatcher
{

 function Dispatcher()
 {
 EventDispatcher.initialize( this );
 }

 private function dispatchEvent( $event:Event ):Void { }
 public function addEventListener( $eventType:String, $handler:Function ):Void { }
 public function removeEventListener( $eventType:String, $handler:Function ):Void { }
}

下一个 MovieClip 版本。


import com.rokkan.events.Event;
import mx.events.EventDispatcher;

class com.rokkan.events.DispatcherMC extends MovieClip
{

 function DispatcherMC()
 {
 EventDispatcher.initialize( this );
 }

 private function dispatchEvent( $event:Event ):Void { }
 public function addEventListener( $eventType:String, $handler:Function ):Void { }
 public function removeEventListener( $eventType:String, $handler:Function ):Void { }
}

只要使用分派器或者DispatcherMC扩展你的对象,你就能够发送事件并侦听事件,类似于 AS3 。 只有一些怪癖。 例如当你调用 dispatchEvent() 时,你必须传递对调度事件的对象的引用,通常只引用对象属性的this


import com.rokkan.events.Dispatcher;
import com.rokkan.events.Event;

class ExampleDispatcher extends Dispatcher
{
 function ExampleDispatcher()
 {

 }

//Call this function somewhere other than within the constructor.
 private function notifyInit():void
 {
 dispatchEvent( new Event( this, Event.INIT ) );
 }
}

另一个怪癖是当你想听那个事件时。 在AS2中,你需要使用 Delegate.create() 来获得事件处理函数的正确范围。 例如:


import com.rokkan.events.Event;
import mx.utils.Delegate;

class ExampleListener
{
 private var dispatcher:ExampleDispatcher;

 function ExampleDispatcher()
 {
 dispatcher = new ExampleDispatcher();
 dispatcher.addEventListener( Event.INIT, Delegate.create( this, onInit );
 }

 private function onInit( event:Event ):void
 {
 //Do stuff!
 }
}

希望我从旧文件中复制并粘贴了所有这些 ! 希望这对你有用。

我想最好的做法是使用任何posible中的EventDispatcher类。 你可以在这里阅读: http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00002325.html

UI组件还具有非常AS3-like事件调度。

我写了几个类来处理AS2中的事件。 你可以在这里下载。

http://dispatchevent.org/mims/as2-eventdispatcher/

...