Comunidad de diseño web y desarrollo en internet online

Leer variable de una clase ...

Citar            
MensajeEscrito el 21 May 2012 11:54 am
Hola,

tras mucho buscar y mucho leer sigo sin dar con la solución,
como mucha gente ha posteado creo que es un problema de concepto:

Necesito leer una variable de una clase des del mxml.

Muestro código de la clase:

Código :

package skant
{
   import flash.net.URLRequest;
   import flash.net.URLLoader;
   import flash.events.Event;
   import flash.display.MovieClip;

   
   
   public class XmlData extends MovieClip
      
   {
      public var liveId:URLRequest = new URLRequest ("archivor.xml");
      public var xmlLoader:URLLoader = new URLLoader;
      
      public var liveID:int = new int;
      public var liveHost2:String = new String;
      public var liveStreamType2:String = new String;
      public var liveStreamName2:String = new String;
      

      
      public function cargarDatos(event:Event):void  
      {

         xmlLoader.addEventListener (Event.COMPLETE, datosCargados);
         xmlLoader.load (liveId);
         
      }


         public function datosCargados (event:Event):void {
            
            
            var articulosXML:XML = XML (event.target.data);
            //trace(articulosXML.live);
            
            liveID = articulosXML.live;
            liveHost2 = articulosXML.liveHost;
            liveStreamType2 = articulosXML.liveStreamType;
            liveStreamName2 = articulosXML.liveStreamName;
            
            trace ("xml: "+liveID+liveHost2+ " y " + liveStreamType2+ " y " + liveStreamName2);
         
      }
   }}


lo que quiero en el mxml es cargar las variables

escribió:

liveID
liveHost2
liveStreamType2
liveStreamName2


lo intento de la siguiente manera:
hago un trace de una de las variables, pero no la puede leer

Código :

         public var liveID:int;
         public var liveHost2:String;
         public var liveStreamType2:String;
         public var liveStreamName2:String;

         public function Charge (event:Event):void {
         
            var miXML:XmlData = new XmlData;
            miXML.cargarDatos(event);
            
      
            trace ("mxlm: "+miXML.liveHost2);
}


En que fallo?
Des de la clase el trace es correcto,
des de el mxml el trace es null o nada,

alguien me puede ayudar,
gracias,
Cristian

Por skant

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 May 2012 12:02 pm
La operación de carga es asíncrona, es decir cuando termina de cargar llama a un callback, que es datosCargados. Desde el MXML intentas cargar y acceder inmediatamente, sin esperar a que se cargue. Lo que debes hacer es que la clase XmlData dispare un evento cuando termine de cargar el XML, lo tienes que estar escuchando (via addEventListener) desde el MXML para en el callback accederlo

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 21 May 2012 02:12 pm
Hola,

no entiendo

ahora tengo des de el mxml

Código :

var miXML:XmlData = new XmlData;
miXML.cargarDatos(event);


y en la clase ya ocurre lo que comentas, al cargar el XML lanza el evento datosCargados,

Código :

      public function cargarDatos(event:Event):void  
      {

         xmlLoader.addEventListener (Event.COMPLETE, datosCargados);
         xmlLoader.load (liveId);

         
      }


he de lanzar otro evento tipo datosCargados?
o he de escuchar des del mxml el evento datosCargados?


por ejemplo: desde el mxml:

Código :

            var miXML:XmlData = new XmlData;
            miXML.cargarDatos(event);
            miXML.xmlLoader.addEventListener (Event.COMPLETE, miXML.datosCargados);



Cristian ;)

Por skant

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 May 2012 02:16 pm
Tienes que "re-dispatchear" el evento

Código ActionScript :

public function datosCargados (event:Event):void {
      {
        (......)
        dispatchEvent(event)         
      }


Y escucharlo desde el MXML

miXML.addEventListener (Event.COMPLETE, otraFuncion);

otraFuncion es una funci[on que escribes en el MXML y allí accedes a las variables que necesitas

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos



Ultima edición por solisarg el 21 May 2012 06:21 pm, editado 1 vez

Argentina

firefox
Citar            
MensajeEscrito el 21 May 2012 04:57 pm
Por fin creo que he entendido el concepto,

el listener del mxml espera que el evento, en mi caso la carga del XML se haya realizado.
Una vez que se ha realizado, la clase emite un evento que el listener escucha y entonces lanzo la función que lee el XML.

Ahora el problema es que no consigo escuchar el evento,

en la clase tengo,

Código :

      public function cargarDatos(event:Event):void  
      {

         xmlLoader.addEventListener (Event.COMPLETE, datosCargados);
         xmlLoader.load (liveId);
         this.dispatchEvent(new Event("myCustomEvent"));
         
      }


el el mxml,

Código :

         public function Testing (event:Event):void {
         
            var miXML:XmlData = new XmlData;
            //miXML.addEventListener (Event.COMPLETE, Charge);
            miXML.addEventListener("myCustomEvent", Charge);
trace ("testing ok"):
         
         }


El problema ahora es que no consigo arranar la función Charge, es decir, no escucho el evento.
voy a seguir leyendo acerca dispatchEvent y los Listeners.

Alguna sugerencia?
Gracias de antemano ;)

Por skant

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 May 2012 05:00 pm
También he probado con ...

Código :

dispatchEvent(new Event(Event.COMPLETE));;


pero tampoco funciona ...

Por skant

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 21 May 2012 06:24 pm
Me equivoque en mis POST anterior, lo edité y corregí, miralo, el evento lo emite la función datosCargados

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 21 May 2012 07:31 pm
ohhh... ;(
creo que sigo sin entender algo ...

efectivamente la corrección de dispatchEvent a generado el evento correcto y el listener ha lanzado la función Charge ...

El problema sin embargo persiste,

Código :

public function Charge (event:Event):void {
            
            var liveHost2:String;
            var miXML:XmlData = new XmlData;
            miXML.cargarDatos(event);
            trace ("variable recogida:"+ liveHost2);

}


y me traza:

escribió:

variable recogida:null


pq?
creía haber entendido el concepto,

alguna última sugerencia ... ;)

Cristian

Por skant

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 May 2012 09:59 am
Hola,

sigo encallado,

tengo una clase que lee un XML y lanza un evento cuando la carga ha terminado,
la clase funciona por si sola y con un trace me muestra los datos,

Código :

package skant
{
   import flash.net.URLRequest;
   import flash.net.URLLoader;
   import flash.events.Event;
   import flash.display.MovieClip;
   
   public class XmlData extends MovieClip
      
   {
      public var liveId:URLRequest = new URLRequest ("archivo.xml");
      public var xmlLoader:URLLoader = new URLLoader;
      
      public var liveID:int = new int;
      public var liveHost2:String = new String;
      public var liveStreamType2:String = new String;
      public var liveStreamName2:String = new String;
      
      public function cargarDatos(event:Event):void  
      {
         xmlLoader.addEventListener (Event.COMPLETE, datosCargados);
         xmlLoader.load (liveId);
      }


      public function datosCargados (event:Event):void {
            
            var articulosXML:XML = XML (event.target.data);
            //trace(articulosXML.live);
            
            liveID = articulosXML.live;
            liveHost2 = articulosXML.liveHost;
            liveStreamType2 = articulosXML.liveStreamType;
            liveStreamName2 = articulosXML.liveStreamName;
            
            trace ("externo: "+liveID+ " ..... " + liveHost2+ " ..... " + liveStreamType2+ " ..... " + liveStreamName2);
            dispatchEvent(event);
            
      }   
   }}


luego en el XML escucho el evento,

Código :

         public function xmlListener (event:Event):void {
         
            var miXML2:XmlData = new XmlData;
            miXML2.cargarDatos(event);
            miXML2.addEventListener (Event.COMPLETE, Charge);
            trace ("xmlListener ok");
            
         
         }


el evento es escuchado y lanzo la función Charge, que por lo que entiendo vuelve a cargar la clase que lee el XML,

Código :

         public function Charge (event:Event):void {
            
            var liveID:int;
            var liveHost2:String;
            var liveStreamType2:String;
            var liveStreamName2:String;
         
            var miXML:XmlData = new XmlData;
            miXML.cargarDatos(event);
            trace ("interno: "+liveID+ " ..... " + liveHost2+ " ..... " + liveStreamType2+ " ..... " + liveStreamName2);

}


Todos los traces funcionan correctamente menos este último que me devuelve:

Código :

interno: 0 ..... null ..... null ..... null


¿Qué estoy haciendo mal?
¿alguna sugerencia?
gracias de antemano ;)

Por skant

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 May 2012 12:16 pm
Básicamente tienes que entender el mecanismo

1. Mando a cargar
2. agrego un listener para cuando termina de cargar
3. En el callback (función que se ejecuta cuando termino de cargar) accedo a las variables

Pero luego tienes varios errores de conceptos dado que no estas habituado al OOP. vamos por partes:

public function cargarDatos(event:Event)

Ese argumento no tiene ningún sentido, ya que la función no lo necesita, y mandar a cargar es un comando, no un callback. Si tiene sentido que le pases el nombre de archivo que tiene que cargar, que en cambio lo tomas de una variable publica (liveId) que se setea desde afuera y rompe la encapsulación de la clase. Entonces

- Cambia el argumento a un string que sea el nombre del archivo que tiene que cargar

Una vez que arregles eso, el comando de la segunda carga debería ser

miXML.cargarDatos("algun.xml");

Y por supuesto no puedes acceder directamente a lo que cargues, debieras agregar un listener, hacer un nuevo callback, etc.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 22 May 2012 03:50 pm
Pensé que ya lo tenía,

he arreglado la clase,

Código :

package skant
{
   import flash.net.URLRequest;
   import flash.net.URLLoader;
   import flash.events.Event;
   import flash.display.MovieClip;

   public class XmlData extends MovieClip
      
   {

      public function cargarDatos(event:Event):void  
      {
         var articulosRequest:URLRequest = new URLRequest ("archivor.xml");
         
         var xmlLoader:URLLoader = new URLLoader ();
         xmlLoader.addEventListener (Event.COMPLETE, datosCargados);
         xmlLoader.load (articulosRequest);
         
         function datosCargados (event:Event):void
         {
            var articulosXML:XML = XML (event.target.data);
            dispatchEvent(event);
            //trace ("new: "+articulosXML);
            var liveID:int = new int;
            var liveHost2:String = new String;
            var liveStreamType2:String = new String;
            var liveStreamName2:String = new String;
            
            liveID = articulosXML.live;
            liveHost2 = articulosXML.liveHost;
            liveStreamType2 = articulosXML.liveStreamType;
            liveStreamName2 = articulosXML.liveStreamName;
            
            //trace ("externo: "+liveID+ " ..... " + liveHost2+ " ..... " + liveStreamType2+ " ..... " + liveStreamName2);
         }
         

      }
      
   }}



Jorge escribió:

- Cambia el argumento a un string que sea el nombre del archivo que tiene que cargar

No me deja cambiarlo por un String, me pide forzosamente URLRequest

Jorge escribió:

miXML.cargarDatos("algun.xml");

Lo mismo que con lo anterior.

Lo que no entiendo para nada es la acción posterior al callback,
representa que tengo el xml cargado, pq hacer otro listener y que ejecuto?

En fin,
por mi parte encantado de aprender, tal vez necesite leer bastante más teoría antes que nada.

He quitado la carga XML de la clase y lo cargo des del mxml y todo correcto,
solucionado a nivel de desarrollo pero estaria encantado de seguir intentando entender por que no entiendo nada ;P

seguiré leyendo,
acepto sugerencias,

gracias de nuevo,
Cristian

Por skant

10 de clabLevel



 

chrome
Citar            
MensajeEscrito el 22 May 2012 03:53 pm
La solución a lo primero

Código ActionScript :

public function cargarDatos(uri:String):void  {
         var articulosRequest:URLRequest = new URLRequest (uri);
         .... 


Y esto es algo muuuuy básico, función y argumento ... si te funciona, te diría que lo otros lo dejes para la próxima, por ahora mucho tutorial y lectura

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 23 May 2012 02:08 pm
Hola,

me rindo,
creo que necesito asentar las bases antes que ponerme a trabajar con clases,

gracias de nuevo,
volveré con más preguntas y sabiduría ;)

Por skant

10 de clabLevel



 

chrome

 

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