Comunidad de diseño web y desarrollo en internet online

Alcanzar una función desde una clase

Citar            
MensajeEscrito el 20 May 2008 11:30 pm
Saludos a toda la comunidad!

Pues me he estado metiendo un poco a la POO con Flex 3 y acostumbrado a ciertas cosas de AS2, pues la migración a AS3 se me hace un poco confusa pero ahi voy.

Mi pregunta es la siguiente, tengo un proyecto de Flex 3 donde en mi aplicación principal tengo un componente llamado LOGIN.MXML (ya se imaginaran que intento hacer), por otro lado tengo una clase llamada Usuario en la cual tengo como propiedades los datos del usuario que se ha de logear así como los métodos para la conexión del servidor. Esta clase es importada en mi componente LOGIN.MXML.

Lo que quiero saber es como hacer mi evento o mandar llamar una función dentro del componente, he intentado usando parent, parentDocument, this.parentDocument, e incluso el nombre de la función pero no logro que mi objeto se comunique con el componente.

Mi idea (burda) es la siguiente

En mi clase tengo algo así...

Código :

package scripts
{
   import flash.events.Event;
   import flash.events.IOErrorEvent;
   import flash.net.URLLoader;
   import flash.net.URLRequest;
   import flash.net.URLVariables;
   import flash.net.URLRequestMethod;
   
   import mx.managers.CursorManager;
      
   public class Usuario
   {
      // --------------------------- PROPIEDADES
      public var IdUsuario:Number;
      public var Nombre:String;
      
      // --------------------------- METODOS
      private function Login(usr:String,pass:String,url:String):void
                {
         CursorManager.setBusyCursor();
         var urRutaLogin:URLRequest = new URLRequest(url);
         var ulCargador:URLLoader = new URLLoader();
         var uvVariables:URLVariables = new URLVariables();
         
         uvVariables.Usuario = usr;
         uvVariables.Clave = pass;
         urRutaLogin.data = uvVariables;
         urRutaLogin.method = URLRequestMethod.POST;
         
         ulCargador.addEventListener(Event.COMPLETE,alCargarLogin);
         ulCargador.addEventListener(IOErrorEvent.IO_ERROR,alErrorLogin);
         ulCargador.load(urRutaLogin);
      }
      
      private function alCargarLogin(evento:Event):void
                {
         // ------ AQUI QUIERO LLAMAR UNA FUNCION LLAMADA \\\"MENSAJE\\\" DEL COMPONENTE
                        Mensaje(\\\"Se conecto al servidor\\\");
         CursorManager.removeBusyCursor();
      }
      
      private function alErrorLogin(evento:IOErrorEvent):void{
         // ------ AQUI QUIERO LLAMAR UNA FUNCION LLAMADA \\\"MENSAJE\\\" DEL COMPONENTE
                        Mensaje(\\\"Error de conexion\\\")
         CursorManager.removeBusyCursor();
      }
      
      // --------------------------- CONSTRUCTOR
      public function Usuario(usr:String,pass:String,url:String){
         Login(usr,pass,url);
      }
   }
}


y en mi componente LOGIN.MXML tengo los iguiente...

Código :

<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?>
<mx:Canvas xmlns:mx=\\\"http://www.adobe.com/2006/mxml\\\" width=\\\"100%\\\" height=\\\"100%\\\">
   <mx:Script>
      <![CDATA[
         import scripts.Usuario;
         
         public function Mensaje(mensaje:String):void{
            txtStatus.text = mensaje;
         }
         
         private function Login():void{
            var Usr:Usuario = new Usuario(txtUsuario.text,txtClave.text,\\\"http://www.servidor.com/login.php\\\");
         } 
      ]]>
   </mx:Script>
   <mx:Panel width=\\\"280\\\" height=\\\"240\\\" layout=\\\"absolute\\\"\">
      <mx:VBox width=\\\"95%\\\" height=\\\"95%\\\" horizontalCenter=\\\"0\\\" verticalCenter=\\\"0\\\" verticalAlign=\\\"middle\\\">
         <mx:Label text=\\\"Usuario\\\"/>
         <mx:TextInput width=\\\"100%\\\" id=\\\"txtUsuario\\\"/>
         <mx:Label text=\\\"Contraseña\\\"/>
         <mx:TextInput width=\\\"100%\\\" id=\\\"txtClave\\\"/>
         <mx:CheckBox label=\\\"Recordar mis datos\\\" id=\\\"chkRecordar\\\"/>
         <mx:HRule width=\\\"100%\\\"/>
         <mx:HBox width=\\\"100%\\\" horizontalAlign=\\\"right\\\" verticalAlign=\\\"middle\\\">
            <mx:Button label=\\\"Entrar\\\" width=\\\"110\\\" height=\\\"32\\\" id=\\\"botEntrar\\\" click=\\\"Login();\\\">
               <mx:icon>@Embed(source=\\\'../imagenes/iconos/22x22/password.png\\\')</mx:icon>
            </mx:Button>
         </mx:HBox>
      </mx:VBox>
   </mx:Panel>
   <mx:Label bottom=\\\"5\\\" left=\\\"5\\\" right=\\\"5\\\" id=\\\"txtStatus\\\"/>
   
</mx:Canvas>



Yo tenia la idea de crear eventos para la clase como por ejemplo Usuario.alConectar o Usuario.alObtenerInfo, pero me saco lo mismo, no se como declarar estos \\\"Eventos\\\" propios de mi clase.

Espero no haberlos hecho bolas y hojala me puedan ayudar, cuando menos a poder comunicar a la clase con el componente que la manda llamar.

Gracias, hasta luego.[/code]

Por heberto

263 de clabLevel

1 tutorial

1 ejemplo

 

Morelia, Michoacán

safari
Citar            
MensajeEscrito el 21 May 2008 02:31 am
Puedes crear una vínculo si una clase tiene que saber de otra. En usuario este método

private var _owner:UIComponent

public function setOwner(owner:UIComponent){
_owner = owner
}

Luego a través de _owner llamas las funciones, lo seteas desde tu componente así:

var Usr:Usuario = new Usuario(txtUsuario.text,txtClave.text,"http://www.servidor.com/login.php");
Use.setOwner(this)

Igual para un diseño mas limpio, usaría una clase Usuario que solo tuviera la info del usuario, y una clase provider que se encargara de la comunicación (URLRequest y demases)

Los eventos los haces via dispatchEvent, hay un POST reciente que habla de eso

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 2008 08:04 am
Un ejemplo simple, simple, simple

Código :

package 
{
   import flash.events.Event;
   import flash.events.EventDispatcher;
   public class Usuario extends EventDispatcher    //nuestra clase extiende de EventDispatcher
   {
     public var IdUsuario:Number=0;
     public var Nombre:String="";
     public static var OK:String = "OK";  //declaramos dos constantes OK y FAIL
     public static var FAIL:String = "FAIL";
      
      // --------------------------- METODOS
      public function Login(usr:String,pass:String):void  //<--he hecho un método login
      {
          if (usr == "Manolo" && pass == "manolo"){
              this.IdUsuario = 1;  //le damos las propiedades que merezcan
              this.Nombre = "Manolo";
              dispatchEvent(new Event(Usuario.OK));  //<--si es OK, el evento OK
      }else{
             dispatchEvent(new Event(Usuario.FAIL));  //<--si no, el evento FAIL
     }
     public override function toString():String{  //<--un método
         return (this.IdUsuario + ":" + this.Nombre);
     }
     
      // --------------------------- CONSTRUCTOR
      public function Usuario(){  //<--el constructor más simple
      }
}

Una aplicación que hiciera uso vendría a ser como

Código :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" initialize="createListener(event);">
   <mx:Script>
      <![CDATA[
      import mx.controls.Alert;
    private var Usr:Usuario = new Usuario();  //SIEMPRE tenemos un usuario
    private function createListener(e:Event):void {  //pues tenemos que añadirle los listeners
        Usr.addEventListener(Usuario.OK, loginOk);
        Usr.addEventListener(Usuario.FAIL, loginFail);
   }
       public function loginOk(e:Event):void{
           txtStatus.text = "Login succefull";
           Alert.show(Usr.toString());
           //ó Alert.show(Usr.Id.toString());
       }
       public function loginFail(e:Event):void{
            txtStatus.text = "Login Fail";
        }
        private function Login():void{
            Usr.Login(txtUsuario.text, txtClave.text);  //usamos el método Login del Usuario
         } 
]]>
   </mx:Script>
     <mx:Panel width="280" height="240" layout="absolute">
      <mx:VBox width="95%" height="95%" horizontalCenter="0" verticalCenter="0" verticalAlign="middle">
         <mx:Label text="Usuario"/>
         <mx:TextInput width="100%" id="txtUsuario"/>
         <mx:Label text="Contrasena"/>
         <mx:TextInput width="100%" id="txtClave"/>
         <mx:HBox width="100%" horizontalAlign="right" verticalAlign="middle">
            <mx:Button label="Entrar" width="110" height="32" id="botEntrar" click="Login();">
            </mx:Button>
         </mx:HBox>
      </mx:VBox>
   </mx:Panel>
   <mx:Label bottom="5" left="5" right="5" id="txtStatus"/>
</mx:Application>

Por Eliseo2

710 de clabLevel



 

firefox
Citar            
MensajeEscrito el 02 Feb 2010 11:37 pm
hay un error en la aplicacion de Eliseo2 en la linea 6

private var Usr:Usuario = new Usuario(); faltaron unas llaves

private var Usr:Usuario = new Usuario(); { }

y se salta otro error en la linea 9 que no se como corregirlo

private function createListener(e:Event):void {

Si alguien puede ayudarme se los agradeseria =D

Por juramy

Claber

217 de clabLevel

2 tutoriales

 

Programador

msie8
Citar            
MensajeEscrito el 03 Feb 2010 09:05 am
¿Poner llaves después de instanciar una clase? Eso no solo te daría error del compilador, no tiene ningún sentido ... ¿o me estoy perdiendo algo?
Ya si haces lo anterior, te encadenará errores sin fin

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 03 Feb 2010 12:38 pm
Juramy, el error es que me comí un "}" -pero al final del código, es el que cerraría la definición de la Clase-

Por Eliseo2

710 de clabLevel



 

firefox

 

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