Foros del Web » Creando para Internet » Flash y Actionscript »

Ayuda con addEventListener

Estas en el tema de Ayuda con addEventListener en el foro de Flash y Actionscript en Foros del Web. Hola. Resulta que estoy realizando algo asi como un onClick para una lista de imagenes que se cargan dinamicamente mediante una consulta a la base ...
  #1 (permalink)  
Antiguo 22/07/2008, 17:58
 
Fecha de Ingreso: abril-2007
Mensajes: 8
Antigüedad: 17 años
Puntos: 0
Ayuda con addEventListener

Hola. Resulta que estoy realizando algo asi como un onClick para una lista de imagenes que se cargan dinamicamente mediante una consulta a la base de datos, es decir, si el elemento tiene como valor 1 aparece una imagen y si es 2 aparece otra, ya todo funciona exepto por que al momento de agregarle el addEventListener a la imagen le estoy pasando como parametros lo siguiente:

Código PHP:
imageA.addEventListener(MouseEvent.CLICK,function():void{myFunction(id_imagen)}); 
donde
myFunction es el metodo a llamar
id_imagen el parametro a pasar, este valor es dinámico leido de la base de datos pero siempre envia el ultimo valir leido de id_imagen.
alguna idea de como solucionarlo ???
  #2 (permalink)  
Antiguo 28/07/2008, 11:24
 
Fecha de Ingreso: marzo-2006
Ubicación: Mexico City
Mensajes: 27
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: Ayuda con addEventListener

si id_imagen es una variable que puede ser accedida desde cualquier parte del script, bastara con que hagas lo siguiente:
Código:
imageA.addEventListener(MouseEvent.CLICK, click_imageA);
private function click_imageA(e:MouseEvent):void {
    //aqui tu codigo a ejecutar en el click de imageA
}
  #3 (permalink)  
Antiguo 30/07/2008, 07:33
 
Fecha de Ingreso: abril-2007
Mensajes: 8
Antigüedad: 17 años
Puntos: 0
Respuesta: Ayuda con addEventListener

Cita:
Iniciado por master_of_puppetz Ver Mensaje
si id_imagen es una variable que puede ser accedida desde cualquier parte del script, bastara con que hagas lo siguiente:
Código:
imageA.addEventListener(MouseEvent.CLICK, click_imageA);
private function click_imageA(e:MouseEvent):void {
    //aqui tu codigo a ejecutar en el click de imageA
}
NOP .. Esa id_imagen es variable y es leida desde una consulta de la base de datos, mira el código es más o menos así:

Código PHP:
for(0Query.RECORDCOUNTi++){ 
 
gridItemA = new GridItem(); 
 
gridRowA = new GridRow(); 
 
imageA = new Image(); 
 if(
Query.DATA.ESTATUS[i] == 1){ 
  
imageA.source="abierto.gif" 
imageA.addEventListener(MouseEvent.CLICK,function():void{miFuncion(Query.DA TA.ID[i])}); 
 } 
else{ 
 
imageA.source="cerrado.gif" 


gridItemA.addChild(imageA); 
gridRowA.addChild(gridItemA); 
gridItem.addChild(gridRowA); 


donde id_imagen = Query.DA TA.ID[i]
  #4 (permalink)  
Antiguo 31/07/2008, 10:18
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Respuesta: Ayuda con addEventListener

Cita:
Iniciado por isragma Ver Mensaje
NOP .. Esa id_imagen es variable y es leida desde una consulta de la base de datos, mira el código es más o menos así:

Código PHP:
for(0Query.RECORDCOUNTi++){ 
 
gridItemA = new GridItem(); 
 
gridRowA = new GridRow(); 
 
imageA = new Image(); 
 if(
Query.DATA.ESTATUS[i] == 1){ 
  
imageA.source="abierto.gif" 
imageA.addEventListener(MouseEvent.CLICK,function():void{miFuncion(Query.DA TA.ID[i])}); 
 } 
else{ 
 
imageA.source="cerrado.gif" 


gridItemA.addChild(imageA); 
gridRowA.addChild(gridItemA); 
gridItem.addChild(gridRowA); 


donde id_imagen = Query.DA TA.ID[i]
Hola isragma !

Porque no extiendes la clase Image de flex para que le puedas añadir el id de la imagen, por ejemplo:

Código PHP:

package 
{
      
      
import mx.controls.Image;
      
      public class 
MyImage extends Image {
              
  
              private var 
_imageId:uint;
              
               
              public function 
get imageId():uint {
                      return 
_imageId;
              }
                
              public function 
set imageId(id:uint):void {
                      
_imageId id;
              }               
      }

Y en tu código en lugar de crear instancias de Image, creas de la clase MyImage pasándole el id de la consulta a su propiedad idImage:

Código PHP:
for(0Query.RECORDCOUNTi++){ 
 
gridItemA = new GridItem(); 
 
gridRowA = new GridRow(); 
 
imageA = new MyImage(); 
 if(
Query.DATA.ESTATUS[i] == 1){ 
  
imageA.source="abierto.gif" 
  
imageA.imageId Query.DATA.ID[i];
imageA.addEventListener(MouseEvent.CLICKonImageClick); 
 } 
else{ 
 
imageA.source="cerrado.gif" 


gridItemA.addChild(imageA); 
gridRowA.addChild(gridItemA); 
gridItem.addChild(gridRowA); 



private function 
onImageClick(evt:MouseEvent) {
      
trace(evt.target.imageId);

Saludos !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #5 (permalink)  
Antiguo 31/07/2008, 10:57
 
Fecha de Ingreso: abril-2007
Mensajes: 8
Antigüedad: 17 años
Puntos: 0
Respuesta: Ayuda con addEventListener

aa que te cres me da este error :

ReferenceError: Error #1069: Property imageId not found on mx.core.FlexLoader and there is no default value.
at aperturaProcesoAnteproy/::onImageClick()

sorry por molestar tanto es que apenas ando aprendiendo esto de Flex Y actionScript

Gracias por tu apoyo
  #6 (permalink)  
Antiguo 31/07/2008, 12:48
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Respuesta: Ayuda con addEventListener

Cita:
Iniciado por isragma Ver Mensaje
aa que te cres me da este error :

ReferenceError: Error #1069: Property imageId not found on mx.core.FlexLoader and there is no default value.
at aperturaProcesoAnteproy/::onImageClick()

sorry por molestar tanto es que apenas ando aprendiendo esto de Flex Y actionScript

Gracias por tu apoyo
No te preocupes isragma, estamos aqui para ayudar.

El depurador te dice que no encuentra la propiedad imageId, coloca un break point en la línea:

Código PHP:
trace(evt.target.imageId); 
Para colocar un break point dale doble click al lado del número de línea, te debe salir un puntito rojo.

Ahora corre tu aplicación, cuando le des click a una imagen, te va avisar el depurador, te vas a la pestaña de variables y buscas la variable llamada evt, dentro de evt debe haber una lista de propiedades, busca la propiedad target, fíjate de que tipo es, debería ser del tipo MyImage si no lo es, entonces la que guarda la referencia a MyImage es currentTarget, busca ese propiedad ahí mismo y ve si es del tipo MyImage si es asi debes cambiar a:


Código PHP:
trace(evt.currentTarget.imageId); 
Cualquier duda aqui andamos.
Saludos!
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #7 (permalink)  
Antiguo 31/07/2008, 14:50
 
Fecha de Ingreso: abril-2007
Mensajes: 8
Antigüedad: 17 años
Puntos: 0
Respuesta: Ayuda con addEventListener

Gracias de nuevo
Fijate que en ambos casos obtuve lo mismo, que evt es del tipo click

Código PHP:
evt flash.events.MouseEvent (@3655971)
    
altKey false
    bubbles 
true
    buttonDown 
false
    cancelable 
false
    ctrlKey 
false
    currentTarget 
MyImage (@37283c1)
    
delta 0
    eventPhase 
3
    localX 
15 [0xf]
    
localY 29 [0x1d]
    
relatedObject null
    shiftKey 
false
    stageX 
795.5
    stageY 
206 [0xce]
    
target mx.core.FlexLoader (@3690e51)
    
type "click" 
¿Crés que tal vez declaré mal algo, o el paquete o lo instancié bien?
  #8 (permalink)  
Antiguo 31/07/2008, 16:45
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Respuesta: Ayuda con addEventListener

Cita:
Iniciado por isragma Ver Mensaje
Gracias de nuevo
Fijate que en ambos casos obtuve lo mismo, que evt es del tipo click

Código PHP:
evt flash.events.MouseEvent (@3655971)
    
altKey false
    bubbles 
true
    buttonDown 
false
    cancelable 
false
    ctrlKey 
false
    currentTarget 
MyImage (@37283c1)
    
delta 0
    eventPhase 
3
    localX 
15 [0xf]
    
localY 29 [0x1d]
    
relatedObject null
    shiftKey 
false
    stageX 
795.5
    stageY 
206 [0xce]
    
target mx.core.FlexLoader (@3690e51)
    
type "click" 
¿Crés que tal vez declaré mal algo, o el paquete o lo instancié bien?
Hola Isragma !

Ya lo tenemos agarrado del chongo

Que bueno que pusiste lo que muestra el depurador, fíjate en esta línea:

currentTarget = MyImage (@37283c1)

La propiedad current target contiene la referencia a tu instancia MyImage, pero como se pasa como object tienes que hacer el casting para poder accesar a imageId.

Código PHP:
private function onImageClick(evt:Event):void {
      var 
image:MyImage evt.currentTarget as MyImage;
      
trace(image.imageId);

Con la palabra reservada 'as', haces el casting como puedes ver.

Nota: Es opcional hacer el casting, puedes acceder también diréctamente, pero por buena practica es bueno hacer el casting explicito para que el compilador te avise si el tipo de dato que estas tratando de convertir a otro es el correcto y evitar así errores inesperados en tiempo de ejecución:
Código PHP:
private function onImageClick(evt:Event):void {
      
trace(evt.currentTarget.imageId);


Un saludo!
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.

Última edición por jahepi; 31/07/2008 a las 16:59
  #9 (permalink)  
Antiguo 31/07/2008, 17:24
 
Fecha de Ingreso: abril-2007
Mensajes: 8
Antigüedad: 17 años
Puntos: 0
Respuesta: Ayuda con addEventListener



A muchas gracias man!!!

como dicen en otros países Thanks you´ve save the day!!!.
Ya llevaba 1 semana con esta bronca y no hallaba la forma de solcucionarlo, y gracias atí si quedo, hay tanto que aún me falta aprender.

En conclusión eres muy chido

Muchas Gracias por tu apoyo !!!
  #10 (permalink)  
Antiguo 31/07/2008, 17:47
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 4 meses
Puntos: 43
Respuesta: Ayuda con addEventListener

No es nada Isragma

Estamos aqui para ayudar, cualquier duda flexera no dudes en contactarme.

Un saludote !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #11 (permalink)  
Antiguo 21/02/2010, 16:20
 
Fecha de Ingreso: enero-2008
Ubicación: Concepción, Chile
Mensajes: 76
Antigüedad: 16 años, 3 meses
Puntos: 3
Respuesta: Ayuda con addEventListener

Cita:
Iniciado por jahepi Ver Mensaje
Hola Isragma !

Ya lo tenemos agarrado del chongo

Que bueno que pusiste lo que muestra el depurador, fíjate en esta línea:

currentTarget = MyImage (@37283c1)

La propiedad current target contiene la referencia a tu instancia MyImage, pero como se pasa como object tienes que hacer el casting para poder accesar a imageId.

Código PHP:
private function onImageClick(evt:Event):void {
      var 
image:MyImage evt.currentTarget as MyImage;
      
trace(image.imageId);

Con la palabra reservada 'as', haces el casting como puedes ver.

Nota: Es opcional hacer el casting, puedes acceder también diréctamente, pero por buena practica es bueno hacer el casting explicito para que el compilador te avise si el tipo de dato que estas tratando de convertir a otro es el correcto y evitar así errores inesperados en tiempo de ejecución:
Código PHP:
private function onImageClick(evt:Event):void {
      
trace(evt.currentTarget.imageId);


Un saludo!
Mira buscando información sobre otro tema llegué por acá, en fin, solo quiero saber si el casting que has realizado es más válido que este otro ejemplo. Adjunto ambos.

PD: Sé que el post es antiguo pero me quedó la duda.

Código PHP:
//De ésta manera:

function clickevent(e:Event):void {
      var 
clip:MovieClip e.currentTarget as MovieClip;
      
trace(clip.name);
}

//o de ésta manera:

function clickevent(e:Event):void {
      var 
clip:MovieClip MovieClip(e.currentTarget);
      
trace(clip.name);

Saluda Atte.
Claudio Barrera Asencio.

Última edición por polo_W12; 21/02/2010 a las 16:23 Razón: Me equivoqué
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:12.