Comunidad de diseño web y desarrollo en internet online

Problemas: listener para linkButton

Citar            
MensajeEscrito el 25 Jun 2008 02:20 pm
Buenas, antes que nada me presento, soy Jonathan, nuevo por éstos lares como usuario registrado pero visitante de Clab desde hace un tiempo, googleando más de una vez he caido acá.
Les cuento rápidamente, hace poco mas de 2 semanas entré a trabajar en una empresa de desarrollo de RIAs, o al menos eso vamos a intentar, entonces me pidieron que aprenda Flex con todo lo que ésto conlleva. :shock:
Después de mucha lectura decidí empezar con mis primeras aplicaciones. He aquí el caso de un form de Login, el cual ya lo he hecho funcionar con PHP de background, y un linkButton que da la posibilidad de registrar un nuevo usuario, tambien funcionando (agrego unos campos más con addChild y bla bla bla...).
El problema es que ese link, que en el estado de registro de user se convierte en "volver a Login", cuando lo presiono vuelve al form de Login, pero no me borra el "value" o "text" de los TextInput, osea, agrego un usuario completando username y password, y cuando vuelvo al form para loguearme quedan los valores viejos... lo que intente fue lo siguiente (despues de leer Tips de Clab)

Aqui está el LinkButton en cuestión:

Código :

<mx:AddChild relativeTo="{spacer1}" position="before">
                <mx:target>
                    <mx:LinkButton id="loginLink" name="loginLink" label="Volver al login"/>
                </mx:target>
            </mx:AddChild>


Dentro de la etiqueta <mx:Script>:

Código :

   function volverLogin(event:MouseEvent):void
   {
      mx.controls.Alert.show("Bandera:Llego!");
      username.text = ""
      password.text = "";
      currentState = "";
   }
   loginLink.addEventListener(MouseEvent.CLICK, volverLogin); //Aqui me da el error!

Descripción del error:
-Acceso a una propiedad volverLogin no definida.
-Acceso a una propiedad loginLink no definida.

Bueno, ahi está definida la funcion, y debajo el listener del evento Mouse, le doy click y hace cualquier cosa, va al Base State (form de Login), pero probé ponerle currentState="loggedHome", que iría al estado como si estuviese logueado, y no vá.. va al Base State también.

Alguien me podria dar una mano? :crap: Creo que es algo básico y si bien quizá no sea práctico para mi ejemplo, me sirve para aprender, de hecho no creo que el metodo de login sea de lo mas profesional, pero me sirvio para entender como se comunican las capas de programación con el bendito XML :love:

Gracias![/quote]

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 25 Jun 2008 08:23 pm
Primero los dos errores

-Acceso a una propiedad volverLogin no definida.

Puede que no hayas definido la visibilidad, prueba

public function volverLogin(event:MouseEvent):void

-Acceso a una propiedad loginLink no definida.

Fíjate que se hace un addChild del linkButton en el segundo estado, es decir cuando se ejecuta el addEventListener, tu botón no forma parte del DisplayList, con lo cual no lo conoce. Deberías ejecutar esta parte del código después de pasar al siguiente estado

Jorge

PD: ¿De que empresa se trata, tiene alguna web o algo para saber de ella?

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 26 Jun 2008 03:19 am
Hola Jorge, gracias por responder, aún no me queda claro lo del segundo error... el script no está disponible para todos los estados?, pensé que ese addEventListener está "escuchando" en todo momento de la aplicación.

La empresa se llama Unísono: http://www.unisonoit.com/
Ahi están las screenshot de unos trabajos realizados en Flex, están recien comenzando en ésta tecnología... el de Photo Point está en Flex (para esas maquinitas con touchscreen para imprimir fotos), el otro es una mezcla de tecnos.

Jonathan

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 26 Jun 2008 09:37 am
Los elementos que hacen a un state son agregados/quitados runtime, mira como empieza el state:

<mx:AddChild relativeTo="{spacer1}" position="before">

Es decir, hace un addChild de un elemento antes del elemento spacer1, lo cual quiere decir que antes de hacer el addChild (es decir en el anterior estado) el elemento no existe en el displayList

Gracias por la info de la empresa

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 26 Jun 2008 02:35 pm
:oops: Ando medio lento, he probado algo, ahora no me sale ningun error pero no me funciona el linkButton, no cambia de estado ni nada.. queda ahi inutillizado

Te pego todo el codigo, éstas trabas en cosas tan simplen me ponen loco :cry: :

Código :

<?xml version="1.0" ?>
<!-- Simple example to demonstrate the Transition class. -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">

    <!-- Define one view state, in addition to the base state.-->
    <mx:states>
        <mx:State name="Register">
           
            <mx:AddChild relativeTo="{loginForm}" position="lastChild">
                <mx:target>
                    <mx:FormItem label="Confirmar:">
                        <mx:TextInput id="confirmar" displayAsPassword="true"/>
                    </mx:FormItem>
                </mx:target>
            </mx:AddChild>
            
           <mx:AddChild relativeTo="{loginForm}" position="lastChild">
                <mx:target>
                    <mx:FormItem label="Apellido:">
                        <mx:TextInput id="apellido"/>
                    </mx:FormItem>
                </mx:target>
            </mx:AddChild>
            
            <mx:AddChild relativeTo="{loginForm}" position="lastChild">
                <mx:target>
                    <mx:FormItem label="Nombre:">
                        <mx:TextInput id="nombre"/>
                    </mx:FormItem>
                </mx:target>
            </mx:AddChild>
            
            <mx:AddChild relativeTo="{loginForm}" position="lastChild">
                <mx:target>
                    <mx:FormItem label="Dirección:">
                        <mx:TextInput id="direccion"/>
                    </mx:FormItem>
                </mx:target>
            </mx:AddChild>
            
            <mx:AddChild relativeTo="{loginForm}" position="lastChild">
                <mx:target>
                    <mx:FormItem label="Teléfono:">
                        <mx:TextInput id="telefono"/>
                    </mx:FormItem>
                </mx:target>
            </mx:AddChild>
            
            <mx:SetProperty target="{loginPanel}" name="title" value="Registrar nuevo usuario"/>
            <mx:RemoveChild target="{registerLink}"/>
            <mx:AddChild relativeTo="{spacer1}" position="before">
                <mx:target>
                    <mx:LinkButton id="loginLink" name="loginLink" label="Volver al login"/>
                </mx:target>
            </mx:AddChild>
            <mx:RemoveChild target="{loginButton}"/>
            <mx:AddChild relativeTo="{controlbar1}" position="lastChild">
                <mx:Button label="Registrar" id="registerButton" color="#1B730F" click="register_user.send();"/>
            </mx:AddChild>
        </mx:State>
        <mx:State name="loggedHome">
            <mx:RemoveChild target="{loginForm}"/>
            <mx:SetProperty target="{loginPanel}" name="width" value="95%"/>
            <mx:SetProperty target="{loginPanel}" name="minHeight" value="300"/>
            <mx:RemoveChild target="{registerLink}"/>
            <mx:SetProperty target="{loginPanel}" name="title" value="Panel de Administración"/>
            <mx:RemoveChild target="{loginButton}"/>
            <mx:AddChild relativeTo="{controlbar1}" position="lastChild">
                <mx:Button label="Logout" id="logoutButton"/>
            </mx:AddChild>
        </mx:State>
    </mx:states>

    <mx:transitions>
        <!-- Define the transition from the base state to the Register state.-->
        <mx:Transition id="toRegister" fromState="*" toState="Register">
            <mx:Sequence targets="{[loginPanel, registerLink, confirmar, loginLink, spacer1]}">
                <mx:RemoveChildAction/>
                <mx:SetPropertyAction target="{loginPanel}" name="title"/>
                <mx:SetPropertyAction target="{loginButton}" name="label"/>
                <mx:SetStyleAction target="{loginButton}" name="color"/>
                <mx:Resize target="{loginPanel}"/>
                <mx:AddChildAction/>
            </mx:Sequence>
        </mx:Transition>

        <!-- Define the transition from the Register state to the base state.-->
        <mx:Transition id="toDefault" fromState="Register" toState="*">
            <mx:Sequence targets="{[loginPanel, registerLink, 
                    confirmar, loginLink, spacer1]}">
                <mx:RemoveChildAction/>
                <mx:SetPropertyAction target="{loginPanel}" name="title"/>
                <mx:SetPropertyAction  target="{loginButton}" name="label"/>
                <mx:SetStyleAction target="{loginButton}" name="color"/>
                <mx:Resize target="{loginPanel}"/>
                <mx:AddChildAction/>
            </mx:Sequence>
        </mx:Transition>
    </mx:transitions>


   <mx:Script>
   <![CDATA[
      import mx.controls.Alert;
      
   import mx.rpc.events.ResultEvent;
   
   private function checkLogin(evt:ResultEvent):void
   {
      
      if(evt.result.loginsuccess == "yes")
      {
      currentState = "loggedHome";
      }
      if(evt.result.loginsuccess == "no")
      {
         mx.controls.Alert.show("Usuario/Contraseña inválido");
      }      
   }
   
   private function registerUser(evt:ResultEvent):void
   {
      if(evt.result.registersuccess == "yes"){
         mx.controls.Alert.show("El usuario ha sido creado");
      }
      if(evt.result.registersuccess == "no"){
         mx.controls.Alert.show("No se pudo efectuar el alta del usuario");
      }
      
   }
   
   
   
   public function volverLogin(event:MouseEvent):void
   {
      currentState = "loggedHome";
      mx.controls.Alert.show("Bandera:Llego!");
      loginLink.addEventListener(MouseEvent.CLICK, volverLogin);
   }
   
   
   ]]>
   </mx:Script>

   <!-- Servicio de Login -->
   <mx:HTTPService   id="login_user"
   result="checkLogin(event)"
   method="POST"
   url="http://localhost/TestCapas/src/login.php"
   useProxy="false"
   showBusyCursor="true">
   <mx:request xmlns="">
   <username>{username.text}</username>
   <password>{password.text}</password>
   </mx:request>
   </mx:HTTPService>
   
   <!-- Servicio de registro de usuario -->
   <mx:HTTPService   id="register_user"
   result="registerUser(event)"
   method="POST"
   url="http://localhost/TestCapas/src/registerUser.php"
   useProxy="false"
   showBusyCursor="true">
   <mx:request xmlns="">
   <username>{username.text}</username>
   <password>{password.text}</password>
   <apellido>{apellido.text}</apellido>
   <nombre>{nombre.text}</nombre>
   <direccion>{direccion.text}</direccion>
   <telefono>{telefono.text}</telefono>
   </mx:request>
   </mx:HTTPService>
   
    <!-- Define a Panel container that defines the login form.-->
    <mx:Panel title="Login de usuario" id="loginPanel" resizeEffect="Resize"
        horizontalScrollPolicy="off" verticalScrollPolicy="off"
        paddingTop="10" paddingLeft="10" paddingRight="10" paddingBottom="10" width="317">
    

        <mx:Form id="loginForm" >
            <mx:FormItem label="Usuario:">
                <mx:TextInput id="username"/>
            </mx:FormItem>
            <mx:FormItem label="Password:">
                <mx:TextInput id="password" displayAsPassword="true"/>
            </mx:FormItem>
        </mx:Form>
        <mx:ControlBar id="controlbar1">
            <mx:LinkButton id="registerLink"  label="No posee usuario?"
                click="currentState='Register'"/>
            <mx:Spacer width="100%" id="spacer1"/>
            <mx:Button label="Login" id="loginButton" click="login_user.send();"/>
        </mx:ControlBar>
    </mx:Panel>
</mx:Application>

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 26 Jun 2008 03:00 pm
¿Un poco largo no? La propiedad currentState es de application, y LinkButton está metido dentro de un controlBar y un Panel, hay un problema de scope

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 26 Jun 2008 03:18 pm
Jeje, si es largo, aún no he pasado a ver como se modulariza el mxml (lo vi muy por encima).
Entonces hay un problema de ámbito, el linkButton no debería ir dentro de esos contenedores? O está mal la definido el objeto en la llamada al método addEventListener?
Mierda!, no hay otra forma de hacerlo? Estoy seguro que debe ser una boludez, pero estoy muy verde en Flex! Perdón por las preguntas repetitivas :S

Jonathan

Por jgriguol

35 de clabLevel



Genero:Masculino  

Argentina

msie7
Citar            
MensajeEscrito el 26 Jun 2008 03:54 pm
De todas formas hay mucha cosa en el código, donde veo que fuiste mezclando ejemplos de la ayuda, vuelve al original LoginExample y mira si te funciona

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.