2009-04-02 10 views
8

Me encanta el modelo de eventos de AS3: ayuda a mantener mi código limpio y con un acoplamiento desacoplado. Cuando solía trabajar en proyectos AS2, mi código no era tan ordenado y las clases eran más dependientes entre sí. Debido al extraño manejo del alcance de AS2, nunca entré realmente con el sistema de eventos AS2.Práctica recomendada para eventos de ActionScript 2: ¿existe alguna forma de simular eventos de estilo ActionScript 3?

Como todavía de vez en cuando tengo que trabajar en AS2, mi pregunta es:

Alguien ha conseguido simular el API caso de AS3 en AS2, y si no es así, ¿cuál es la mejor práctica para escuchar y el envío de eventos y manejo del alcance?

Respuesta

9

Es bastante fácil de hacer esto, en realidad. Un par de clases deberían ayudarte a avanzar. La primera es una clase Event, como sigue:

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 + "]"; 
    } 
} 

Entonces, uso otras dos clases de base. Uno para objetos regulares y para objetos que necesitan extenderse MovieClip. En primer lugar la versión no 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 { } 
} 

A continuación la versión 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 { } 
} 

una simple extensión de sus objetos, ya sea con o despachador DispatcherMC y usted será capaz de distribuir eventos y escuchar los sucesos de manera similar a AS3. Hay solo algunas peculiaridades. Por ejemplo, cuando llama al dispatchEvent(), debe pasar una referencia al objeto que despacha el evento, generalmente solo haciendo referencia a la propiedad this del objeto.

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)); 
    } 
} 

La otra peculiaridad es cuando desea escuchar ese evento. En AS2, necesita usar Delegate.create() para obtener el alcance correcto de la función de manejo de eventos. Por ejemplo:

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! 
    } 
} 

¡Espero haber copiado y pegado todo esto correctamente de mis archivos antiguos! Espero que esto funcione para usted.

+0

Muchas gracias hombre, que el rock! – Iain

+0

@Matt W, ¿por qué es el símbolo $? – Simsons

+0

@Subhen, que es solo una antigua convención de estilo de código que solía utilizar para denotar los parámetros de función de las variables locales y de instancia. –

Cuestiones relacionadas