Comunidad de diseño web y desarrollo en internet online

dispatchEvent de padre a hijo

Citar            
MensajeEscrito el 14 Nov 2009 06:17 pm
Hola a todos.
Tengo una inquietud acerca de los eventos personalizados: usualmente los he trabajado desde los hijos hacia los padres (es decir, un movieclip lanza un dispatchEvent y su padre lo "escucha"), pero ahora necesito uno que pueda ir en sentido inverso (es decir, que el padre lance el dispatchEvent y todos sus hijos lo "escuchen")... ¿se puede hacer?

He estado intentándolo como siempre, pero no me funciona... en el padre (Escenario.as) pongo algo así:

Código ActionScript :

dispatchEvent(new Event("BORRAR_SELECCION"));


Y en el hijo (Objeto.as) he puesto:

Código ActionScript :

//constructor
addEventListener("BORRAR_SELECCION", quitarSeleccion);
...
public function quitarSeleccion(e:Event):void{
...
}


Pero como les digo, no me funciona... ¿hay manera de hacerlo? Agradezco cualquier orientación.

Saludos!!!

Por ExGaul

Claber

180 de clabLevel



Genero:Masculino  

Cereté - Colombia

firefox
Citar            
MensajeEscrito el 14 Nov 2009 07:43 pm
Tienes un problema con las rutas, por eso no te coge el evento.

Si haces el dispatchEvent desde escenario, y objeto es un movieClip que cargas en el escenario, el dispatch event lo deberias hacer desde Objeto.as, es decir, el displayObject que tengas asociado (tuDisplayObject.dispatchEvent(new Event...).

Si hicieras el addEventListener en el escenario también te funcionaría, no se si me he explicado muy bien...

Por ur!

256 de clabLevel



 

Barcelona

chrome
Citar            
MensajeEscrito el 15 Nov 2009 01:56 pm
Hola ur!, gracias por tu respuesta.

Precisamente, tengo muy claro que haciéndolo como dices, es decir, lanzando el dispatchEvent desde el hijo (Objeto.as) y escuchándolo en el padre (Escenario.as), la cosa funciona muy bien... pero es que en ese sentido va mi pregunta:

¿Se puede hacer en sentido inverso, es decir, de padre (Escenario.as) a hijo (Objeto.as)? ¿Cómo? Yo aún no encuentro la manera...

Saludos!!!

Por ExGaul

Claber

180 de clabLevel



Genero:Masculino  

Cereté - Colombia

chrome
Citar            
MensajeEscrito el 15 Nov 2009 09:45 pm
Hola,
el problema está en que en el objeto hijo, el listener tienes que asociarlo al padre. Para eso puedes pasarle al objeto hijo el propio objeto padre como parámetro. Ejemplo:
Objeto padre, Escenario:

Código ActionScript :

package
{
   import flash.display.MovieClip;
   import flash.events.Event;
   import Objeto;
   
   public class Escenario extends MovieClip
   {
      private var objeto:Objeto;
      
      public function Escenario()
      {
         addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
         objeto = new Objeto(this);
      }
      
      private function addedToStageHandler(event:Event):void
      {
         trace("Evento disparado por el padre");
         dispatchEvent(new Event("BORRAR_SELECCION"));
      }
   }
}

Objeto hijo, Objeto:

Código ActionScript :

package
{
   import flash.display.MovieClip;
   import flash.events.Event;
   import Escenario;
   
   public class Objeto extends MovieClip
   {
      public function Objeto(escenario:Escenario)
      {
         escenario.addEventListener("BORRAR_SELECCION", borrarSeleccionHandler);
      }
      
      private function borrarSeleccionHandler(event:Event):void
      {
         trace("Evento disparado por el padre, capturado por el hijo");
      }
   }
}

En el .fla:

Código ActionScript :

import Escenario;
var escenario:Escenario = new Escenario();
addChild(escenario);

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 15 Nov 2009 10:38 pm
Hola isidoro, gracias por tu respuesta.

Efectivamente, parece que así funciona... estoy haciendo pruebas y todo ha salido bien hasta ahora. Muchas gracias!!!

Sin embargo, me pregunto si no habrá algún comportamiento extraño si continuo agregando hijos (Objetos.as), y cada uno de ellos definen el evento BORRAR_SELECCION para el escenario... es decir, cada objeto, al agregarse, iría declarando el mismo evento nuevamente en Escenario. ¿No habría problemas con eso?

Saludos!!!

Por ExGaul

Claber

180 de clabLevel



Genero:Masculino  

Cereté - Colombia

chrome
Citar            
MensajeEscrito el 16 Nov 2009 07:42 am
Hombre, si quieres usar una forma elegante de implementar eso, busca información sobre el patrón de diseño observer (creo que se llama así), pero ten en cuenta que de todos modos cada uno de los objetos hijos tiene que registrar un listener para el evento enviado por el padre.

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox
Citar            
MensajeEscrito el 16 Nov 2009 12:59 pm
Hola de nuevo,
releyendo el post me he dado cuenta de que casi es mejor que los objetos hijos no escuchen el evento del padre. Es mejor que el padre llame a un método de los objetos hijos, para mejorar la encapsulación de las clases y crear un único listener. Ejemplo:
Objeto padre:

Código ActionScript :

package
{
   import flash.display.MovieClip;
   import flash.events.Event;
   import Objeto;
   
   public class Escenario extends MovieClip
   {
      private var objeto:Objeto;
      private var objeto2:Objeto;
      
      public function Escenario()
      {
         super();
         addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
         objeto = new Objeto();
         objeto2 = new Objeto();
      }
      
      private function addedToStageHandler(event:Event):void
      {
         objeto.borrarSeleccion();
         objeto2.borrarSeleccion();
      }
   }
}

Objeto hijo:

Código ActionScript :

package
{
   import flash.display.MovieClip;
   
   public class Objeto extends MovieClip
   {
      public function Objeto()
      {
         super();
      }
      
      public function borrarSeleccion():void
      {
         trace("Ejecuta el método");
      }
   }
}

Por isidoro

Claber

498 de clabLevel

2 tutoriales

Genero:Masculino  

firefox

 

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