Comunidad de diseño web y desarrollo en internet online

Problema con eventos en un contenedor...

Citar            
MensajeEscrito el 11 Abr 2011 08:45 am
Os explico mi problema, porque no doy con la solución:

Estoy trabajando en una aplicación AIR que trabaja con formularios. Estoy creando uno de los formularios a partir de los datos de un array, es decir, pongo los datos del array y doy la opción de añadir un peso con un numericstepper, tal que así:

Código Flex :

for(var recorrido:String in Med)
               {      
                  contadorcalif = contadorcalif + 1;
                  var indicecalif:String = contadorcalif.toString();
                  var pp:FrmClf = new FrmClf();
                  
                  CAL.addChild(pp);
                  pp.medCal.text = Med[recorrido].datos;
                  pp.name = indicecalif;
                  Calif.addItemAt(pp.name,0);//Creo un array donde meto los nombres de los hijos y asi eliminarlos por nombre
                  var calific:Calificaciones = new Calificaciones(pp.medCal.text,pp.pesoCal.value.toString(),pp.calCal.text,indicecalif);
                  pp.pesoCal.addEventListener(Event.CHANGE,function(e:Event):void{guardarpesos(e,calific);});
                  Calif2.addItem(calific);
               }


Os explico, pp es un componente que yo he creado, con 3 campos, 2 textinput y un numericstepper. Para cada elemento del array, añado un componente pp, donde aparecerá el dato del array(pp.medCal), el numericstepper (pp.pesoCal), y un campo de resumen de estos 2 datos(pp.calCal)... añado un evento para controlar los cambios en el numericstepper y hasta ahí todo bien... Quiero coger los datos de cada hijo con su peso para pasarlos a un reporte.

El problema es que no sé detectar o colocar el evento en un hijo en concreto, es decir, si el array tenía 4 elementos, me añade 4 componentes, pero el listener lo coloca siempre en el último elemento, así que varíe lo que varíe, solo varía el peso en el último elemento, visualmente bien, pero en el reporte me aparecen todo 0, menos el último...

¿Cómo puedo detectar en qué numericstepper estoy haciendo el CHANGE? En la funcion guardarpesos hago lo siguiente:

public function guardarpesos(e:Event,calif:Calificaciones): void
{
var porcentaje:String = (e.currentTarget.value / 100).toString();
var calculofinal:String = calif.datos + " * " + porcentaje;
var calificando2:Calificaciones = new Calificaciones(calif.datos,e.currentTarget.value,calculofinal,calif.indexx);
}// FIN function

Esta función obtiene bien el currentTarget, es decir el valor actual del numericstepper, pero no puedo obtener los otros datos del hijo donde está el numericstepper


EN RESUMEN: Si añado dinamicamente varios hijos a un contenedor, y estos hijos son un componente con varios elementos, ¿Cómo detectar mediante un evento todos los datos de ese child? Gracias!!!!

Por Claudi2011

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Abr 2011 02:19 pm
Suena a que estás sobreescribiendo el listener, no uses una función anónima para manejarlo, dale un handler posta,

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 11 Abr 2011 04:02 pm
Precisamente hace un rato caí en que en la secuencia del for, me daba la impresión de que machacaba los listeners, y dejaba solo el último, ¿cómo hago lo que dices? ¿a qué te refieres?

Gracias!!!

Por Claudi2011

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Abr 2011 04:05 pm
En vez de esto:

pp.pesoCal.addEventListener(Event.CHANGE,function(e:Event):void{guardarpesos(e,calific);});


Esto

pp.pesoCal.addEventListener(Event.CHANGE,cambia);

Luego

Código ActionScript :

function cambia() {
  //aqui implementas
}


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 11 Abr 2011 08:15 pm
Ya lo he modificado, y sigue igual...

CAL es el contenedor, ahí añado los childs (pp), que son un componente propio con 2 textinput y el numericstepper, como expliqué antes... Necesito que la funcion detecte el child en el que estoy, para poder tomar el dato del textinput asociado, y que el event CHANGE se asocie con el numericstepper que estoy pulsando, pero ahora mismo solo lo asocia al último... cuando modifico el stepper, aunque sean 8, en el reporte solo aparece modificado el final, aunque haya modificado el primero, y con los datos del último...

Por Claudi2011

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Abr 2011 08:18 pm
La función es

Código ActionScript :

function cambia(evt:Event) { 
  //aqui implementas 
}


No lo incluí en el POST anterior, luego ese Event tiene targets distintos, solo se sobreescibe si tienes una función anónima.

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 11 Abr 2011 08:52 pm
Lo hice con el evento y sigue sin funcionar, hace lo mismo...

¿Tendría que detectar algún otro tipo de evento antes en el contenedor CAL, o en el hijo pp, y luego activar el listener del numericstepper? Es que no he dado con otra manera de detectar los cambios en el spinner del stepper, y el target del evento solo se refiere a los cambios en el spinner, a lo mejor por eso falla, ¿no?

Por Claudi2011

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 11 Abr 2011 09:02 pm
Posiblemente sea un tema de rutas, o haya eventos de por medio. Mira si el currentTarget es el mismo. Si tienes muchas cosas anidadas, quizás lo mejor es que hagas un dispatchEvent desde tu clase, es decir escuchas internamente y reenvias el evento hacia afuera, ya que este tipo de problemas tienen que ver con fallas de estructura

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 12 Abr 2011 11:33 am
Vuelvo a consultar, aunque ante todo gracias por las respuestas, me está aclarando mucho las ideas....

He aquí mi componente MXML, llamado FrmClf.mxml:

Código Flex :

<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
       xmlns:s="library://ns.adobe.com/flex/spark" 
       xmlns:mx="library://ns.adobe.com/flex/mx" width="444" height="143">

   <fx:Script>
      <![CDATA[
         import mx.events.FlexEvent;
         
         public static const CAMBIO_SPINNER:String = "cambiopesos";
         
         [Bindable] public var califActual:CalificaMedios = new CalificaMedios();   
         //   FlexGlobals.topLevelApplication.dispatchEvent(....)
         [Bindable] public var datos:String;
         

         protected function pesoCal_changeHandler(event:Event):void
         {            califActual.setdatos(medCal.text,event.currentTarget.value,calCal.text);
            dispatchEvent(new Event(CAMBIO_SPINNER));
         }
      ]]>
   </fx:Script>

   <mx:Form x="0" y="-1" width="444" height="143" creationPolicy="all">
      <mx:FormItem label="Medios" id="medCAL1">
         <s:TextInput width="284" id="medCal" toolTip="Introduzca la descripción del medio de evaluación a calificar"/>
      </mx:FormItem>
      <mx:FormItem label="Peso" id="pesoCAL1">
         <s:NumericStepper maximum="100" minimum="0" id="pesoCal" change="pesoCal_changeHandler(event:Event)"/>
      </mx:FormItem>
      <mx:FormItem label="Cálculo" id="calCAL1">
         <s:TextInput width="284" id="calCal" text="{medCal.text} * {((pesoCal.value)/100).toString()}" toolTip="Fórmula de cálculo de la calificación"/>
      </mx:FormItem>
   </mx:Form>
</s:Group>


En principio generé una función para que me creara un objeto de tipo CalificaMedios, y lo modificara cada vez que se modificara el Spinner, pero no sé porqué no me modifica el objeto, que por cierto tiene el siguiente código:

CalificaMedios.as

Código Flex :

package
{
   public class CalificaMedios extends Object
   {
      [Bindable] public var datos:String;
      [Bindable] public var peso:String;
      [Bindable] public var calculo:String; 
      
      public function CalificaMedios(dat:String = "",pes:String = "",calc:String = "")
      {
         this.datos = dat;
         this.peso = pes;
         this.calculo = calc;
      }
      
      public function getmedio(): String
      {
      return this.datos; 
      }
      
      public function getpeso(): String
      {
         return this.peso;
      }
   
      public function getcalculo(): String
      {
         return this.calculo;
      }
   
   
   }
   
}


Mi idea era que almacenara los datos del componente cada vez que cliqueara en el spinner en un objeto de tipo CalificaMedios, y luego acceder desde mi aplicación a esos valores. El objeto siempre aparece vacio, que es como está creado por defecto, y la función change no modifica esos valores, ¿alguien sabría decirme por qué?

He hecho lo que Jorge me ha dicho, si es que lo he entendido bien, lanzar desde aquí el evento, y captarlo en el código, (pp.addEventListener(FrmClf.CAMBIO_SPINNER,guardarpesos);) pero sigo sin ver resultados...

Gracias por todo

Por Claudi2011

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Abr 2011 01:37 pm
¿Será porque no tiene un método público setdatos?

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 12 Abr 2011 01:55 pm
Lo tenía, pero no me funcionó y lo quité en una de las pruebas..., no me he dado cuenta y lo he dejado mal en el código, pero sí lo tiene... tanto copypaste y comentar me tiene atolondrada...
¿setDatos que lo que hace es asignar los nuevos valores no sería lo mismo que poner califActual = new CalificaMedios(pp.medCal.text, pp.pesoCal.value.toString(),pp.calCal.text)?;

Por Claudi2011

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 12 Abr 2011 02:06 pm
Lo estás declarando cuando asignas la variable, mueve el constructor al evento y entonces si lo puedes hacer. Agrega un trace a ver si el handler se está ejecutando

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 13 Abr 2011 01:56 pm
Te pedía mover el constructor dentro de pesoCal_changeHandler y comprobar si se ejecuta, igual intentaste otra cosa que es un poco larga de leer ... a menos que aparezca eliseo a darte una respuesta/tutorial, la brevedad y foco serán tus aliados

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 13 Abr 2011 04:13 pm
Gracias, Jorge, lo intentaré, tanto en el código como en la brevedad...

Intento ser breve, pero me da la impresión que faltan datos para poder contestarme, que no os doy lo que necesitais para saber por donde va la cosa, aunque entiendo que es un tocho de leer...

Probaré en el código lo que dices, aunque creo recordar que ya lo probé ayer, y en blanco, la impresión que me daba es que el handler no llegaba a ejecutarse, porque lo miré con el depurador, y nunca variaba del valor por defecto del constructor de la clase, es decir, cadena vacía, ¿por qué no se ejecutaba el handler? ¿Debería llamarlo desde mi aplicación principal? No sé si he dicho que el componente está en una libreria de componentes, no en el proyecto de mi aplicación principal, aunque va enlazado, y otros componentes funcionan sin problema... no he probado a usar AS3 generado en los propios componentes, no sé si me falta algo...

Por Claudi2011

8 de clabLevel



 

firefox

 

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