Passage de paramètres à des écouteurs d'événement / gestionnaires
Comment passer des paramètres /variables à travers les écouteurs d'événement? J'ai surmonter ce problème assez efficacement à l'aide de fonctions anonymes; ce qui est incroyablement une solution simple, mais à la fin de la journée, il sent comme une grosse lacune pour la fonctionnalité que je me sens devrait être fournis en natif, de toute façon.
Normalement la vie irait, mais comme le destin l'aurait, maintenant j'ai en fait besoin de supprimer l'auditeur, et de le faire lorsque vous avez à l'aide d'une fonction anonyme est un peu funky. Donc, encore une fois, je suis à essayer de comprendre comment passer des paramètres grâce à des écouteurs d'événement, de sorte que les écouteurs d'événement peut être retiré simplement en référencement de la fonction.
Aussi étrange que cela puisse paraître, j'ai surmonter ce problème ainsi, MAIS, je ne l'aime pas et fatigué de l'utiliser. À mon avis, il est odeur de code. Mais il fonctionne comme un charme. - Je stocker la variable, un objet ou quoi que ce soit sur la répartition MovieClip. Donc, si je suis en boucle si un tableau de données, la génération de vignettes à la volée, j'ai simplement stocker la variable de données (normalement un objet avec plusieurs propriétés) dans la vignette MovieClip. Ensuite, je peux accéder à toutes les données dans un écouteur d'événement par la méthode de référencement:
événement.cible.les données
.
Dans cet exemple, les "données" est le nom de la variable holding holding les informations que je souhaite. Car un autre problème qui surgit lorsque je ne l'utilise pas c'est que quand je suis en boucle dans un tableau et de générer des vignettes cliquez sur pour afficher des images de grande taille, l'indice n'est pas cohérente. À la fin de la boucle, TOUTES les thumbails seront tous ouvrir une image à l'aide du dernier indice du "je". Donc, si j'avais un tableau avec une longueur de 12 ans, ils avaient tous de la charge de la 12e image indépendamment de ce que la vignette sur lequel vous avez cliqué. Stocker les données dans le MovieClip lui-même, crée une référence solide qui ne change jamais.
Cela a été me tracasse depuis un certain temps maintenant. Fondamentalement, ce que je veux savoir, c'est, est-ce une bonne pratique, il y a de meilleures solutions?
Ci-dessous sont quelques-uns régime des exemples. Je peux poster des exemples plus détaillés, si nécessaire. Tous les exemples illustrent une vignette qui charge une grande image quand on clique dessus.
Sans l'utilisation d'une fonction anonyme (le problème):
tempThumb.la méthode addEventListener(MouseEvent.CLIQUEZ sur, loadImage); publique fonction loadImage(_event:MouseEvent):void { //Je n'ai pas la variable _url et de préparer un bain chaud avec une froide lame }
L'utilisation d'une fonction anonyme:
tempThumb.la méthode addEventListener(MouseEvent.CLIQUEZ sur la fonction(_event:MouseEvent) { loadImage("large.jpg"); } ); publique fonction loadImage(_url:String):void { //J'ai eu la variable _url et de ranger les lames de rasoir }
Sans l'utilisation d'une fonction anonyme, mais à l'aide de mon malodorante Lutin technique de stocker les données dans le MovieClip envoi de l'événement
tempThumb.data = "large.jpg"; tempThumb.la méthode addEventListener(MouseEvent.CLIQUEZ sur, loadImage); publique fonction loadImage(_event:MouseEvent):void { trace(event.cible.données); //Je peux accéder à la variable }
Je ne suis pas doué en place sur la programmation de la terminologie, de sorte que j'ai surnommé le au-dessus de la Leprechaun Technique. Stockage /masquer des variables dans les objets pour les utiliser plus tard /l'accès. Il résout tous mes problèmes et fonctionne étonnamment bien. Mais, si il ya une meilleure façon de le faire, je veux savoir que.
OriginalL'auteur Daniel Carvalho | 2009-09-23
Vous devez vous connecter pour publier un commentaire.
Si le MovieClip besoin de garder une trace de l'information supplémentaire que vous devez savoir quand il est cliqué, alors je voudrais utiliser un plus formel de la version de votre Lutin technique.
J'avais créer une nouvelle classe appelée quelque chose comme SpecialImage que extends MovieClip et a une propriété pour le stockage de l'url à charger.
Selon la façon dont votre SpecialImages sont créés, vous pouvez les créer dans le code ou le lien d'un MovieClip dans votre bibliothèque à cette classe.
En gros, c'est un hôtel chic de lutin, mais que l'information est directement liée à l'image de MovieClip, de les stocker ensemble se sent comme la meilleure chose.
Je pense être en mesure de relier des clips d'animations pour des classes Personnalisées est l'une des grandes forces de flash. Vous obtenez le meilleur des deux flash designer et la flexibilité de code.
Toutefois, si vous n'utilisez pas le flash concepteur original de votre loadImage MovieClip alors vous pouvez encapsuler la logique c'est de le faire dans la classe et de l'instancier dans votre code.
Ouais vous avez raison, il serait de jouer en Flash de gros atouts.
OriginalL'auteur Richard Garside
(Je pense que vous aurez envie de lire cette réponse.)
Au sujet de votre doute, vous l'avez senti vous-même: votre lutin de malodorante (jeu de mots). Imaginez, c'est un Sprite à la place d'un MovieClip. Il n'est pas dynamique, de sorte que vous ne pouvez pas ajouter des propriétés à moins que vous ne à l'instar de Richard a dit.
Voici la meilleure solution, vous l'avez souhaité, en fonction de votre exemple:
Mais vous voulez être en mesure de supprimer les auditeurs, donc:
OriginalL'auteur
Vous pouvez utiliser ce qu'on appelle les "Délégués" si vous n'aimez pas stocker les données dans les membres de cible. Aucune n'est meilleure que l'autre. C'est surtout la préférence.
Voici un exemple d'un Délégué de classe (rien intégrée): http://www.actionscript.org/resources/articles/205/1/The-Delegate-Class/Page1.html
C'est probablement la meilleure idée si l'eventdispatcher n'est pas votre propre classe. Sinon, le stockage de la variable dans votre propre classe n'est pas une mauvaise idée du tout. Juste OOP style.
Acclamations.
OriginalL'auteur Glenn
Oui je sais ce que tu veux dire. Ce que je fais est d'étendre l'événement et donc envoi un événement personnalisé. De cette façon, je peux créer des propriétés de l'événement personnalisé qui contiennent les données nécessaires. Il semble propre, mais ne nécessite un peu d'effort. Il n'est pas l'idéal, mais je ne sais pas de bien meilleure façon.
OriginalL'auteur Allan
Les fonctions anonymes sont mieux évités car ils peuvent rendre le code maladroit et parfois conduire à des fuites de mémoire. Je voudrais utiliser des événements personnalisés si je suis responsable de l'envoi de l'événement, mais qui n'est pas le cas ici.
Dans ce cas, je voudrais stocker les Url et les clips séparée en deux au niveau de la classe les tableaux et l'utilisation
dans le gestionnaire d'événement pour obtenir l'URL.
Il n'y a rien de mal avec le stockage de données dans le movieclip, mais je n'ai pas l'impression que c'est une bonne façon d'aller. Mais en suivant les meilleures pratiques, même quand ils font des choses difficiles n'est pas une bonne idée non plus - le choix est vôtre.
OriginalL'auteur Amarghosh
Vous pouvez effectuer les opérations suivantes, qui, fondamentalement, est un nettoyeur de voie de transmission de données personnalisé.
C'est juste une autre façon d'utiliser les fonctions anonymes....
OriginalL'auteur Sudheer
Il est probablement préférable de faire une classe qui extends MovieClip pour votre thumnbnail, et pour que la vignette de l'envoi d'une classe d'Événement personnalisé qui a un endroit pour stocker vos données:
Faire un personnalisé
URLEvent
qui peut stocker lesurl
propriété avec l'événementFaire une vignette personnalisée classe qui peut stocker les
url
variable, et envoie un URLEvent quand on clique dessus:Vous pouvez maintenant utiliser votre
Thumbnail
de la classe à charger chaque image:Cette méthode est beaucoup mieux que la pratique de la programmation orientée objet, que vous n'avez pas besoin de savoir quel type d'objet de votre événement.la cible est - vous le savez le type d'événement exactement quel type de données sera envoyée à chaque événement.
OriginalL'auteur Reuben
Si j'étais à la recherche de cette fonctionnalité, et je le fais souvent, je voudrais faire tempThumb une Classe qui a effectué la propriété url. alors:
Taper fort, facile d'accès, propre syntaxe, de faible complexité.
OriginalL'auteur Joel Hooks