As3 addEventListener + pasage paramètres objet perso

As3 addEventListener + pasage paramètres objet perso - Flash/ActionScript - Programmation

Marsh Posté le 11-08-2009 à 11:54:22    

Bonjour,
je souhaiterais pouvoir créer dynamiquement des linkButtons à partir d'un ensemble d'objets persos contenus dans un ArrayCollection, et ceci dans le but de gérer un calendrier (je simplifie mon code ici en ne gardant que l'essentiel).
Pour cela, à chaque LinkButton que je crée à partir de chacun de mes objets, je souhaite ajouter un EventListener. Je souhaite ensuite récupérer, dans la méthode associée à l'événement, les attributs de mon objet en cours.
Mon problème ici est que l'instance d'objet que je récupère est toujours la dernière de la boucle.
 
Voici mon code :
 

Code :
  1. for each(var obj:Object in myArrayCollection){
  2.     var lbutton:LinkButton = new LinkButton();
  3.     lbutton.addEventListener(MouseEvent.CLICK, function (e:MouseEvent):void{
  4.         clickLButtonListener(e, obj);
  5.     });
  6. }
  7. private function clickLButtonListener(event:MouseEvent, obj:Object){
  8.     event.currentTarget.label = obj.libelle;
  9. }


 
L'exemple est simplifié, je sais qu'on pourrait affecter le libellé de l'objet au label du linkbutton directement, mais c'est juste pour l'exemple.
Ici mon problème c'est que le label de tous mes linkbuttons est le même : c'est le libellé du dernier objet parcouru dans la boucle.
 
Tout fonctionne bien si je passe par l'événement :
 

Code :
  1. for each(var obj:Object in myArrayCollection){
  2.     var lbutton:LinkButton = new LinkButton();
  3.     lbutton.label = obj.libelle;
  4.     lbutton.addEventListener(MouseEvent.CLICK, clickLButtonListener);
  5. }
  6. private function clickLButtonListener(event:MouseEvent){
  7.     event.currentTarget.label = LinkButton(event.currentTarget).label;
  8. }


mais ce n'est pas ce que je souhaite faire. Je voudrais récupérer tous les attributs de mon objet dans ma méthode 'clickLButtonListener' (pas seulement le libellé, il y en a d'autre);
 
J'ai essayé en créant une nouvelle instance pour chaque objet dans ma boucle, et de la passer au listener, plutot que l'objet directement, mais ca ne change rien au problème.
 
Quelqu'un aurait-il une solution pour moi svp?

Reply

Marsh Posté le 11-08-2009 à 11:54:22   

Reply

Marsh Posté le 11-08-2009 à 13:04:39    

Au risque de dire une très grosse bêtise :

Code :
  1. for each(var obj:Object in myArrayCollection)
  2. {
  3.    var lbutton:LinkButton = new LinkButton();
  4.    lbutton.addEventListener(MouseEvent.CLICK, clickLButtonListener);
  5. }
  6.  
  7. private function clickLButtonListener(event:MouseEvent):void
  8. {
  9.    event.currentTarget.label = event.target.libelle;
  10. }


Message édité par abais le 11-08-2009 à 13:05:14

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Marsh Posté le 11-08-2009 à 13:30:36    

erreur de copier/coller de ma part (pour l'oubli de ':void'.
De tte façon il me semble que ça passe sans ça.

Reply

Marsh Posté le 11-08-2009 à 21:29:39    

Oui ça passe, mais là n'est pas la question, j'insistais ici de passer par la propriété target de l'event pour cibler l'objet en question...
Et surtout, tu déclares la fonction du mouseEvent dans le Listener, donc, une fois par boucle... Ce qui fait que la fonction est écraser à chaque "each", il est donc logique qu'il ne retienne que la dernière.


Message édité par abais le 11-08-2009 à 21:33:18

---------------
Le membre ci-contre n'est pas responsable du message ci-dessus.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed