8

我喜欢 AS3 事件模型——它有助于保持我的代码干净和有损耦合。当我过去从事 AS2 项目时,我的代码不是那么整洁,并且类之间更加相互依赖。由于 AS2 对范围的奇怪处理,我从未真正了解过 AS2 事件系统。

由于我仍然偶尔需要在 AS2 中工作,所以我的问题是:

有没有人设法在 AS2 中模拟 AS3 事件 API,如果没有,监听和调度事件以及处理范围的最佳实践是什么?

4

3 回答 3

9

实际上,它很容易做到这一点。几节课应该能让你继续前进。第一个是一个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 { }
}

只需使用 Dispatcher 或 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!
    }
}

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

于 2009-04-02T14:33:35.403 回答
2

我想最好的做法是尽可能使用 EventDispatcher 类。您可以在此处阅读: http ://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00002325.html

UI 组件也有非常类似于 AS3 的事件调度。

于 2009-04-02T10:30:06.940 回答
0

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

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

于 2009-11-12T08:17:06.143 回答