Comunidad de diseño web y desarrollo en internet online

Propagacion de Eventos en actionScript 3

Citar            
MensajeEscrito el 14 May 2008 01:40 pm
Como podemos propagar eventos de una clase a otra para manejarlos en una clase donde no se ha producido el evento ?
Se pueden crear nuestro propios eventos ?

Por Deschain

20 de clabLevel



Genero:Masculino  

España

firefox
Citar            
MensajeEscrito el 14 May 2008 02:09 pm
Creo que he encontrado la solucion...

Con dispatchEvent y algo sobre propagarlo en burbuja (vaya nombre) supongo que se refiere que va en orden jerarquico hasta el documento raiz.

Ahora lo de crear un evento lo tengo mas a menos facil...

Gracias

Por Deschain

20 de clabLevel



Genero:Masculino  

España

firefox
Citar            
MensajeEscrito el 14 May 2008 02:10 pm
Para comunicar una clase a otra, si claseA escucha eventos "ready" de claseB, desde claseA

claseB.addEventListener("ready", mifuncion)

Donde claseB es una instancia de esta clase, of course.
Para que una clase pueda usar dispatchEvent tiene que extender a otra clase que lo implemente (por ejemplo MovieClip) y luego usas

dispatchEvent(new Event("ready"))

Usualmente necesitarás meter algún tipo de dato en event, con lo cual puedes extender Event con una clase propia, aquí un ejemplo:

Código :

package {
   import flash.events.Event;
   
   public class ObjectEvent extends Event 
   {
      private var data : Object;
      //Attribute extra for the event
      public function ObjectEvent (type : String, data : Object){
         super (type, false, false);
         this.data = data;
      }
      public function getData () : Object{
         return data;
      }      
   }
} 


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 14 May 2008 02:37 pm
No sé si es lo que buscas, pero viendo un ejemplo de un preloader múltiple, tenemos, p.e. que si una clase extiende de EventDispacher, puedes crearte tus propios errores. Del ejemplo del loader múltiple

Código :

public  class ImageLoader extends EventDispatcher {
    public static const IMGS_LOADED:String = \"imgsLoaded\";
    public static const LOAD_ERROR:String = \"loadError\";
    function ImageLoader(){...}
    //en algun momento
    dispatchEvent(new Event(ImageLoader.LOAD_ERROR));
    //en otro momento
    dispatchEvent(new Event(ImageLoader. IMGS_LOADED));
}

Desde una película tendríamos

Código :

imgLoader=new ImageLoader();
imgLoader.addEventListener(ImageLoader.LOAD_ERROR,errorLoading);

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 15 May 2008 09:53 am
He creado un paquete Events donde guardo voy a guardar todos los tipos de eventos que voy a crear. Por ahora solo tengo uno que pinta como esto...

Código :

package modules.Events
{
   public class searchEvent extends Event{
      
      private var andSearch:Array; 
      private var orSearch:Array;
      
      public function searchEvent(type:String, andValues:Array, orValues:Array){
         super(type,true,false);
         this.andSearch = andValues;
         this.orSearch  = orValues;
      }
         
      public function getValues():Array{
         var values:Array = new Array();
         values.push(this.andSearch);
         values.push(this.orSearch);
         return values;               
      }
   }
}


Pero no se como lanzar este evento, ya que lo he intentado de esta manera per me da errores y no entiendo por que (lo facil que seria un simple throw...)

Código :

this.dispatchEvent(new searchEvent('filter',andValues,orValues));

Por Deschain

20 de clabLevel



Genero:Masculino  

España

firefox
Citar            
MensajeEscrito el 15 May 2008 12:00 pm
Arreglado.
En mi profunda ignorancia y despiste habia puesto un nombre al archivo distinto al de la clase porque queria meter varios eventos (clases) dentro de un mismo archivo. Ahora que el archivo tiene el nombre de la clase, con el codigo anterior e importando flash.Events.Event en la clase que extiende de este no me da ningun problema al invocar el evento.

Muchas gracias a todos.

P.D. Si creeis que conviene que cuelgue el codigo de las llamadas y los listener me lo decis que no seria ningun problema

Por Deschain

20 de clabLevel



Genero:Masculino  

España

firefox
Citar            
MensajeEscrito el 16 May 2008 01:53 pm
Lo que ahora me pregunto es como puedo hacer que una clase que no extiende de ninguna otra puede lanzar un evento. Por ahora lo he apañado haciendo que herede de Sprite, pero no me parece que sea una solucion muy optima o por lo menos no muy saludable (aunque funciona).

Otra cosa que me ronda la cabeza es lo siguiente. En un post anterior explicaba un problema con el sincronismo entre clases el cual habia solucionado de una manera un tanto chapucera.
Ahora lo arreglo por medio de eventos que se propagan hasta la clase que controla/maneja/contiene el resto de objetos. Ahora bien, esta clase tiene que esperar por un resultado que genera un objeto hijo en el handle de un httprecuest y lo consigo como he dicho antes por un event que se propaga. Lo mas razonable en cuanto a diseño es que el resultado de la clase que realiza la peticion y que necesita la clase manager/controladora que contiene ese objeto deberia ser pasado por el evento (que yo he creado y que podria contener la informacion) o como contiene al objeto en un atributo obtenerlo por medio de un metodo get en la clase que ha obtenido el resultado.

Si no me he explicado bien incluire las partes del codigo relacionadas con este hecho.

Gracias

Por Deschain

20 de clabLevel



Genero:Masculino  

España

firefox
Citar            
MensajeEscrito el 16 May 2008 02:10 pm
Depende si quieres un diseño mas acoplado o desacoplado. En un diseño mas acoplado (típico MVC) El modelo, la vista y el controlador saben cada uno del otro mediante referencias directas entre ellos, se suele usar composición y puedes usar get para obtener la info. La contra de este diseño es que la implementación de las clases muchas veces influyen en las otras, y los cambios obligan a hacer cambios en cascada. Un diseño basado en eventos (hay muchos patrones que lo implementan) es desacoplado, y no importa cuanto cambien las clases implicadas, mientras el evento se mantenga ... en este sentido es un diseño mas flexible
En cuanto el EventDispatcher, lo puedes extender directamente y si no quieres, puedes usar composición, es decir, importas la clase, instancias un EventDispatcher, aunque en ese caso debes poner métodos addEventListener y removeEventListener como wrappers de tu EventDispatcher

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 16 May 2008 02:22 pm
Pues hombre, creo que lo mejor es mantener el menor grado de acoplamiento posible. Aunque no necesariamente menor acoplamiento quiere decir mayor flexibilidad (eso creo), yo entiendo el acoplamiento como independencia entre distintos modulos (me trae por el camino de la amargura lo del acoplamiento/cohesion).
Tampoco lo tengo muy claro, porque Ingenieria del Software es la unica asignatura que me queda para terminar la carrera (y el proeyecto, que es por el por el que pregunto tanto).

Muchisimas gracias solisarg, me estas ayudando muchisimo con esto. Cuando acabe el proyecto y si lo suben a un servidor te mandare el enlace para que veas como queda :wink: porque una gran parte ha salido adelante gracias a tus consejos.

Por Deschain

20 de clabLevel



Genero:Masculino  

España

firefox
Citar            
MensajeEscrito el 16 May 2008 03:06 pm
Suerte, yo como jamás estudié programación en la universidad y ni siquiera en un cutre terciario, no me preocupo por las asignaturas ;)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 11 Mar 2009 04:19 pm
hola a todos

Yo consegui mandar un evento a varios objetos con un bucle, despues dentro de cada objeto habia una caracteristica para discriminar, a unos si y otros no, un poco sucio.

El tema de no poder hacer un dispatchEvent a todos los objetos no lo comprendo por que no... Aunque he leido alguna aclaracion. Intente hacer un dispa... desde root pero no cuajo..

Si alguien pone mas luz en este tema.

un saludo

Por isdito

1 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Mar 2009 04:26 pm
Sugerencia: abre un hilo nuevo, agrega el code que estes usando para despachar el evento

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.