2010-05-05 1 views
2

J'ai créé un MouseEvent personnalisé dans Flex:FLEX, Actionscript: comment puis-je appeler un CustomEvent?

package { 

    import flash.events.MouseEvent; 
    public class CustomMouseEvent extends MouseEvent { 

     public var tags:Array = new Array();  
     public function CustomMouseEvent(type:String, tags:Array) { 
      super(type, true); 
      this.tags = tags; 
     } 
    } 
    } 

Maintenant, je voudrais comprendre comment passer les balises de paramètres à la fois Actionscript et MXML:

De actionscript j'essaie quelque chose comme ça , mais il ne fonctionne pas:

newTag.addEventListener(MouseEvent.MOUSE_UP, dispatchEvent(new CustomMouseEvent(MouseEvent.MOUSE_UP,[newTag.name]))); 

De MXML je fais cela et cela ne fonctionne pas aussi bien:

<mx:LinkButton click="dispatchEvent(new CustomMouseEvent(MouseEvent.MOUSE_UP, bookmarksRepeater.currentItem.tags))" /> 

grâce

+0

Quelle erreur obtenez-vous? – oedo

+1

Pourquoi faites-vous étendre votre classe à MouseEvent? Je pense que c'est beaucoup plus facile et plus clair si vous créez une classe qui prolonge l'événement. (Et je devine que vous serez meilleur si vous définissez votre propre nom d'événement et n'utilisez pas le MOUSE_UP dans ce cas) –

+0

ok vous droite, j'étend l'événement maintenant – aneuryzm

Répondre

3

Essayez d'envelopper le code de rappel en fonction:

newTag.addEventListener(MouseEvent.MOUSE_UP, function(e:MouseEvent):void { 
    dispatchEvent(new CustomMouseEvent(MouseEvent.MOUSE_UP, [e.currentTarget.name])); 
}); 

Je pense que le problème avec le code MXML est que vous utilisez un répéteur et essayer d'obtenir le currentItem après la répétition a terminé . Essayez ceci:

<mx:LinkButton click="dispatchEvent(new CustomMouseEvent(MouseEvent.MOUSE_UP, event.currentTarget.getRepeaterItem().tags))" /> 

espoir qui aide.

Mise à jour

Puisque vous créez l'objet newTag dans une boucle, vous obtiendrez une meilleure utilisation de la mémoire en utilisant simplement une fonction nommée comme l'écouteur d'événement.

newTag.addEventListener(MouseEvent.MOUSE_UP, onTagClick); 

... 

protected function onTagClick(e:MouseEvent):void { 
    dispatchEvent(new CustomMouseEvent(MouseEvent.MOUSE_UP, [e.currentTarget.name])); 
} 

De cette façon, vous créez un seul écouteur d'événement, plutôt que n auditeurs qui font exactement la même chose.

+0

ouais .. J'ai le même problème avec newTag. newTag est créé dans une boucle for, donc newTag.name est juste le nom de la dernière balise que j'ai ajoutée (lorsque je déclenche l'événement, runtime). Alors, quelle est la solution? – aneuryzm

+0

Juste mis à jour ma réponse à montrer en utilisant le 'currentTarget' de l'événement pour obtenir l'objet' newTag' correct. Est-ce que ça marche? –

+0

parfait. Toutes mes questions sont résolues – aneuryzm

2

également, vous pouvez obtenir des TypeErrors pour ne pas avoir ignoré la méthode clone. Vous devriez corriger cela maintenant, avant de le rencontrer plus tard.

greetz
back2dos

+0

cool merci pour le pourboire. +1 – aneuryzm

0

Avez-vous essayé de changer le type à autre chose qu'un type qui est actuellement utilisé. Quelque chose comme CustomMouseEvent.MY_CUSTOM_MOUSE, puis attraper cela pour voir si cela fonctionne. Je ne sais pas si l'utilisation du même nom de type en tant que type standard est une bonne technique.

Questions connexes