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

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

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

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

Ответы [ 3 ]

9 голосов
/ 02 апреля 2009

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

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

2 голосов
/ 02 апреля 2009

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

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

0 голосов
/ 12 ноября 2009

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

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

...