2009-04-02 17 views
8

Adoro il modello di eventi AS3: aiuta a mantenere il mio codice pulito e incoerente. Quando lavoravo a progetti AS2, il mio codice non era così accurato e le classi erano più dipendenti l'una dall'altra. A causa della strana gestione dell'ambito di AS2, non sono mai riuscito a utilizzare il sistema di eventi AS2.Best practice per eventi ActionScript 2: esiste un modo per simulare eventi in stile ActionScript 3?

Come ho ancora tanto in tanto devo lavorare in AS2, la mia domanda è:

nessuno è riuscito a simulare l'API evento AS3 in AS2, e se no, qual è la migliore pratica per l'ascolto e dispacciamento eventi e ambito di gestione?

risposta

9

È abbastanza facile farlo, in realtà. Un paio di lezioni dovrebbero farti andare. Il primo è una classe Event, come segue:

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

Poi, io uso altri due classi base. Uno per oggetti normali e on per oggetti che devono estendere MovieClip. In primo luogo la non MovieClip versione ...

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

Avanti la versione 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 { } 
} 

semplicemente estendere gli oggetti sia con Dispatcher o DispatcherMC e si sarà in grado di inviare gli eventi e ascoltare per eventi allo stesso modo di AS3. Ci sono solo alcune stranezze. Ad esempio, quando si chiama dispatchEvent() è necessario passare un riferimento all'oggetto che invia l'evento, in genere solo facendo riferimento alla proprietà dell'oggetto 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)); 
    } 
} 

L'altro capriccio è quando si desidera ascoltare quell'evento. In AS2 è necessario utilizzare Delegate.create() per ottenere l'ambito corretto della funzione di gestione degli eventi. Ad esempio:

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

Spero di aver copiato e incollato tutto correttamente dai miei vecchi file! Spero che questo funzioni per te.

+0

Grazie mille amico, rock! – Iain

+0

@Matt W, perché il simbolo $ è? – Simsons

+0

@Subhen è solo una vecchia convenzione di stile di codice che ho usato per indicare i parametri di funzione da variabili locali e di istanza. –