Comunidad de diseño web y desarrollo en internet online

Clases en AS3 duda existencial

Citar            
MensajeEscrito el 12 Nov 2008 02:59 pm
Realmente este no es un problema, mas bien es una inquietud programacional jeje :P
La cosa es esta tengo una clase por decir algo asi:

Código :

package classes{

   public class Main extends MovieClip {
      var buildPreferences:BuildPreferences 
   
      public function callBuildPreferences ($nodeInfo:XML){
         myInfo = $nodeInfo;
         buildPreferences = new BuildPreferences ($nodeInfo,this)
      }
      public function preferencesLoaded ($backGround){

      }
}


Y tengo esta otra clase que la anterior instancio

Código :

package classes{
   import flash.events.Event;
   import flash.net.URLLoader;
   import flash.net.URLRequest;
   import flash.display.Loader;
   //*************
   //*********** Esta clase construye las preferencias que llegan de la solicitud de validar al usuario
   public class BuildPreferences {
      var currentBackGround:String;
      var currentContainer:Loader;
      var callBack;
      public function BuildPreferences ($nodeInfo,$parent){
         currentBackGround = $nodeInfo.@backGround[0];;
         callBack = $parent;
         loadBackground ();
      }
      private function loadBackground (){
         currentContainer = new Loader();
         var bgURL:URLRequest = new URLRequest(currentBackGround);
         currentContainer.load(bgURL);
         currentContainer.contentLoaderInfo.addEventListener (Event.COMPLETE, preferencesLoaded);
      }
      function preferencesLoaded (e:Event){
         callBack.preferencesLoaded (e.target.content);
      }
   }
}


Como ven para poder regresar al que instancio la clase despues de un evento lo que hice fue que el que instancia la clase se mande como parametro para que la otra clase pueda hacer un llamado a un metodo de el cuando haya terminado.
Hay alguna forma de hacerlo mas decente, como poner en vez de callBack.preferencesLoaded (e.target.content); algo asi como parent.preferencesLoaded (e.target.content); o algo asi.

Por estebanam1982

20 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Nov 2008 04:41 pm
Yo haría algo así... con eventos. así no tenemos tanto acoplamiento ya que la clase BuildPreferences no tiene que conocer quien es su parent ni guardar referencias a el. Simplemente lanza un evento y quien quiera que lea de su propiedad publica : miCosita .

Código :

package classes{

   public class Main extends MovieClip {
      var buildPreferences:BuildPreferences 
   
      public function callBuildPreferences ($nodeInfo:XML){
         myInfo = $nodeInfo;
         buildPreferences = new BuildPreferences ($nodeInfo);
         // Le añades un listener a la clase para que escuche eventos desde ella
         buildPreferences.addEventListener(Event.CHANGE, dataChange);

      }

      private function dataChange(e : Event) : void{
            trace(buildPreferences.miCosita);
      }

      public function preferencesLoaded ($backGround){

      }
}


Código :


package classes{
   import flash.events.Event;
   import flash.net.URLLoader;
   import flash.net.URLRequest;
   import flash.display.Loader;
   //*************
   //*********** Esta clase construye las preferencias que llegan de la solicitud de validar al usuario
   public class BuildPreferences {
      var currentBackGround:String;
      var currentContainer:Loader;

      public var miCosita : String;
      public function BuildPreferences ($nodeInfo){
         currentBackGround = $nodeInfo.@backGround[0];
         loadBackground ();
      }
      private function loadBackground (){
         currentContainer = new Loader();
         var bgURL:URLRequest = new URLRequest(currentBackGround);
         currentContainer.load(bgURL);
         currentContainer.contentLoaderInfo.addEventListener (Event.COMPLETE, preferencesLoaded);
      }
      function preferencesLoaded (e:Event){
         // Seteas la publica con el valor que necesitas
         this.miCosita = e.target.content;
         // Despachas el evento para que el mundo sepa que algo cambió en esta clase y los oyentes se refresquen
         var evento : Event = new Event(Event.CHANGE);
         dispatchEvent(evento);

      }
   }
}

Por Siroko

3 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 12 Nov 2008 04:45 pm
Ah esta super cool :cool:
Me encanta esa solucion no se me ocurrio usar un listener a una bandera.
MUCHAS GRACIAS!!!

Por estebanam1982

20 de clabLevel



 

firefox

 

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