Лучшая практика для событий ActionScript 2 - есть ли способ имитировать события в стиле ActionScript 3?

Мне нравится модель событий AS3 - она ​​помогает сохранить мой код чистым и плохо связанным. Когда я работал над проектами AS2, мой код был не таким аккуратным, и классы больше полагались друг на друга. Из-за странного обращения с областью видимости в AS2 я так и не смог добиться успеха в системе событий AS2.

Поскольку мне все еще иногда приходится работать в AS2, мой вопрос:

Кому-нибудь удалось смоделировать API событий AS3 в AS2, и если нет, то каков наилучший способ прослушивания и отправки событий и области обработки?


person Iain    schedule 02.04.2009    source источник


Ответы (3)


На самом деле это довольно легко сделать. Пара занятий должна вас подтолкнуть. Первый - это класс 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!
    }
}

Надеюсь, я правильно скопировал и вставил все это из своих старых файлов! Надеюсь, это сработает для вас.

person Matt W    schedule 02.04.2009
comment
@Matt W, зачем нужен символ $? - person Simsons; 23.07.2011
comment
@Subhen - это просто старое соглашение о стиле кода, которое я использовал для обозначения параметров функции из локальных переменных и переменных экземпляра. - person Matt W; 24.07.2011

Я предполагаю, что лучше всего будет использовать класс EventDispatcher везде, где это возможно. Вы можете прочитать об этом здесь: http://help.adobe.com/en_US/AS2LCR/Flash_10.0/help.html?content=00002325.html

Компоненты пользовательского интерфейса также имеют диспетчеризацию событий, очень похожую на AS3.

person Jacob Poul Richardt    schedule 02.04.2009

Я написал несколько классов для работы с событиями в AS2. Вы можете скачать их здесь.

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

person Mims H. Wright    schedule 12.11.2009