2012-09-25 67 views
9

cualquiera puede dar un ejemplo sencillo de cómo distribuir un evento en ActionScript3 con un objeto que se le atribuye, comoCómo distribuir un evento con los datos agregados - AS3

dispatchEvent(new Event(GOT_RESULT,result)); 

Aquí result es un objeto que Quiero pasar junto con el evento.

+1

dado ejemplo, para sí mismo. ¿Dónde estás exactamente atrapado? – bfavaretto

+0

Gracias por la respuesta, soy nuevo en as3 y me gustaría saber cómo pasar un objeto con un evento de envío. – user1022521

+1

Debe extender la clase de evento para crear su propio objeto de evento personalizado. Vea un ejemplo aquí: http://cookbooks.adobe.com/post_AS3__Creating_and_dispatching_Custom_Events-17609.html – bfavaretto

Respuesta

30

En caso de que desee pasar un objeto a través de un evento, debe crear un evento personalizado. El código debería ser algo como esto.

public class MyEvent extends Event 
{ 
    public static const GOT_RESULT:String = "gotResult"; 

    // this is the object you want to pass through your event. 
    public var result:Object; 

    public function MyEvent(type:String, result:Object, bubbles:Boolean=false, cancelable:Boolean=false) 
    { 
     super(type, bubbles, cancelable); 
     this.result = result; 
    } 

    // always create a clone() method for events in case you want to redispatch them. 
    public override function clone():Event 
    { 
     return new MyEvent(type, result, bubbles, cancelable); 
    } 
} 

continuación, puede utilizar el código anterior como esto:

dispatchEvent(new MyEvent(MyEvent.GOT_RESULT, result)); 

Y detectar este evento cuando sea necesario.

addEventListener(MyEvent.GOT_RESULT, myEventHandler); 
// more code to follow here... 
protected function myEventHandler(event:MyEvent):void 
{ 
    var myResult:Object = event.result; // this is how you use the event's property. 
} 
+0

Así es como debe hacerse. Algunas pequeñas adiciones; Siempre utilizo un campo captador en lugar de un campo público para datos de eventos. También cambiaría el nombre de GOT_RESULT a RESULTADO para mantenerlo claro. –

+2

Btw Creé una herramienta en línea para crear eventos as3 personalizados http://projects.stroep.nl/EventGenerator/ podría ayudar a configurar más rápido. Siéntase libre de usar. –

+1

Acepto cambiar el nombre de la constante de evento a RESULTADO, solo intentaba mantener las cosas lo más cerca posible de los nombres de las variables de ejemplo del OP para evitar cualquier confusión que pudiera surgir. –

0

Si está diseñado correctamente, no debería tener que pasar un objeto al evento.
En su lugar, debe hacer una var pública en la clase de despacho.

public var myObject:Object; 

// before you dispatch the event assign the object to your class var 
myObject = ....// whatever it is your want to pass 
// When you dispatch an event you can do it with already created events or like Tomislav wrote and create a custom class. 

// in the call back just use currentTarget 
public function myCallBackFunction(event:Event):void{ 

    // typecast the event target object 
    var myClass:myClassThatDispatchedtheEvent = event.currentTarget as myClassThatDispatchedtheEvent 
    trace(myClass.myObject)// the object or var you want from the dispatching class. 


+0

¿Estás diciendo que pasar un objeto es una mala decisión de diseño, o simplemente dar una alternativa? Pregunto porque las API de Flash/Flex parecen pasar objetos con bastante frecuencia. – bfavaretto

+4

Si entiendo lo que acaba de decir; Estoy respetuosamente en desacuerdo. Agregar valores a objetos de evento es una buena encapsulación. En muchos casos, preferiría ese enfoque en lugar de introspectar el Objetivo actual (o el objetivo) para recuperar datos de variables públicas en una instancia. Encuentro esto especialmente beneficioso en una lista de visualización donde un evento aparecerá en varios niveles en la jerarquía de visualización. – JeffryHouser

+3

Aunque a veces uso esta metodología, no es una buena opción para cada escenario (su primera oración lo sugiere). por ejemplo, si tiene varias clases que envían el mismo evento (pero no tienen una subclase común), en esos casos un evento personalizado es una ruta mucho más clara. Además, hay algo que decir sobre la separación de intereses.Si la clase que distribuye el evento no tiene una razón para saber sobre la clase que está escuchando/manejando el evento, entonces un evento personalizado es mejor para esa situación también. Hace que las pruebas unitarias MUCHO más fácil – BadFeelingAboutThis

3

Este post es un poco viejo, pero si puede ayudar a alguien, puede utilizar la clase DataEvent así:

dispatchEvent(new DataEvent(YOUR_EVENT_ID, true, false, data)); 

Documentation

Cuestiones relacionadas