Übergabe-Parameter an Ereignis-Listener / Handler
Wie haben Sie die übergabe von Parametern /Variablen, die durch Ereignis-Listener? Ich habe dieses problem lösen können relativ effektiv mit Hilfe anonymer Funktionen, die eine unglaublich einfache Lösung, aber am Ende des Tages, es riecht wie ein riesiges Schlupfloch für Funktionalität, die ich fühle mich sollte zur Verfügung gestellt werden nativ sowieso.
Normalerweise Leben würde weitergehen, aber wie das Schicksal es wollte, jetzt habe ich tatsächlich benötigen, um den listener entfernen, und tut so, als habe Sie mithilfe einer anonymen Funktion ist ein bisschen funky. Also, noch einmal, ich versuche, herauszufinden, wie die übergabe von Parametern durch, um Ereignis-Listener, so dass die event-Listener entfernt werden kann einfach durch verweisen auf die Funktion.
So seltsam, wie es scheinen mag, ich habe zu überwinden dieses Problem sowie, ABER ich mag es nicht, und müde, es zu benutzen. Meiner Meinung nach ist der code, den Geruch. Aber es funktioniert wie ein Charme. Ich Speichere die variable, ein Objekt oder was auch immer auf den Versand MovieClip. Also, wenn wechsele ich aber ein array von Daten, das erstellen von thumbnails on-the-fly, habe ich einfach die Daten gespeichert, die variable (normalerweise ein Objekt mit mehreren Eigenschaften) in der eigentlichen thumbnail-MovieClip. Dann kann ich Zugriff auf alle Daten, die in einem Ereignis-listener-Methode verweisen:
Veranstaltung.Ziel.Daten
.
In diesem Beispiel "Daten" die Namen der Variablen halten halten die Informationen, die ich will. Denn ein weiteres Problem, das auftaucht, wenn ich nicht dieses ist, ist, dass wenn ich die Schleife durch ein array und die Generierung von Miniaturansichten, die auf zu große Bilder, die index ist nicht konsistent. Am Ende der Schleife werden ALLE die thumbails alle öffnen Sie ein Bild mit dem letzten index des "ich". Wenn ich also ein array mit einer Länge von 12, Sie würde alle Last der 12th Bild, unabhängig davon, was Miniaturansicht, auf die Sie geklickt haben. Die Speicherung der Daten in den MovieClip selbst, schafft eine solide Referenz, die sich nie ändert.
Diese wurde stört mich seit einiger Zeit. Im Grunde, was ich wissen möchte ist, ist diese gute Praxis, gibt es bessere Lösungen gibt?
Im folgenden sind einige Diät-Beispiele. Kann ich nach mehr detaillierte Beispiele, wenn nötig. Alle Beispiele zeigen eine Miniaturansicht, die Lasten, die ein großes Bild, wenn darauf geklickt.
Ohne die Verwendung einer anonymen Funktion (das problem):
tempThumb.addEventListener(MouseEvent.KLICKEN Sie auf, loadImage); public function loadImage(_event:MouseEvent):void { //Ich habe nicht die variable _url und bereiten Sie ein heißes Bad mit einem kalten Klinge }
Verwendung einer anonymen Funktion:
tempThumb.addEventListener(MouseEvent.KLICKEN Sie auf, Funktion(_event:MouseEvent) { loadImage("large.jpg"); } ); public function loadImage(_url:String):void { //Ich habe die variable _url und die Verpackung entfernt die Rasierklingen }
Ohne die Verwendung einer anonymen Funktion, aber mit meinem stinkenden Kobold Technik der Speicherung der Daten in das MovieClip, das das Ereignis auslöst
tempThumb.Daten = "large.jpg"; tempThumb.addEventListener(MouseEvent.KLICKEN Sie auf, loadImage); public function loadImage(_event:MouseEvent):void { trace(event.Ziel.Daten); //Kann ich den Zugriff auf die variable }
Ich bin nicht clued auf die Programmierung Terminologie, so habe ich die genannt, die über die Kobold-Technik. Lagern /verstecken von Variablen in Objekte für die spätere Verwendung. Es löst alle meine Probleme und funktioniert erstaunlich gut. Aber, wenn es gibt ein besserer Weg, es zu tun, ich will wissen , dass Weg.
InformationsquelleAutor Daniel Carvalho | 2009-09-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn der MovieClip muss verfolgen, zusätzliche Informationen, die Sie brauchen, zu wissen, Wann es geklickt wurde, dann würde ich einen stärker formalisierten version Ihres Kobold-Technik.
Ich würde erstellen Sie eine neue Klasse namens etwas wie SpecialImage, extends MovieClip und hat eine Eigenschaft, die für die Speicherung der url zu laden.
Je nachdem, wie Ihr SpecialImages erstellt werden, können Sie entweder im code oder den link eines MovieClip in Ihrer Bibliothek zu dieser Klasse.
Es ist im Grunde eine schicke Kobold, aber da die Informationen direkt mit dem Bild, MovieClip, speichern Sie Sie zusammen, fühlt sich an wie die beste Sache.
Ich denke, dass in der Lage, Videoclips zu Benutzerdefinierten Klassen ist eine der großen stärken von flash. Sie erhalten das beste aus beiden der flash-designer und die Flexibilität des Codes.
Allerdings, wenn Sie nicht mit der flash-designer, um Ihren ursprünglichen loadImage MovieClip-dann können Sie die Kapseln alle Logik ist, dass es in die Klasse und instanziieren Sie es in Ihrem code.
Ja du hast Recht, es würde spielen in der Flash-große stärken.
InformationsquelleAutor Richard Garside
(Ich denke, Sie werden wollen, Lesen Sie diese Antwort.)
In Bezug auf deine Zweifel, Sie fühlte es selbst: Ihr Kobold, der stinkende (Wortspiel). Vorstellen, es ist eine Sprite anstelle der MovieClip. Es ist nicht dynamisch, das heißt, Sie können nicht hinzufügen von Eigenschaften, es sei denn, Sie tun wie Richard sagte.
Hier ist die bessere Lösung, die Sie wünschten, auf der Grundlage Ihrer Beispiel:
Aber Sie wollen in der Lage zu entfernen Zuhörer, so:
InformationsquelleAutor
Können Sie verwenden, was heißt "Delegierten", wenn Sie nicht wie die Speicherung der Daten in der Ziel-Mitglied. Weder ist besser als der andere. Es ist meist nur Präferenz.
Hier ist ein Beispiel einer Delegate-Klasse (nichts built-in): http://www.actionscript.org/resources/articles/205/1/The-Delegate-Class/Page1.html
Das ist wahrscheinlich die beste Idee, wenn der eventdispatcher ist nicht Ihre eigene Klasse. Andernfalls speichern Sie die variable in eine eigene Klasse ist keine schlechte Idee überhaupt. Einfach-OOP-Stil.
Cheers.
InformationsquelleAutor Glenn
Ja, ich weiß, was du meinst. Was ich Tue, ist zu erweitern, das Ereignis, und so versenden Sie ein benutzerdefiniertes Ereignis aus. Auf diese Weise kann ich erstellen-Eigenschaften im benutzerdefinierten Ereignis, die enthalten die notwendigen Daten. Es scheint sauber, aber erfordert ein wenig Aufwand. Es ist nicht ideal, aber ich weiß nicht, von einem deutlich besseren Weg.
InformationsquelleAutor Allan
Anonyme Funktionen sind besser zu vermeiden, da Sie den code ungeschickt und manchmal führt zu Speicherlecks. Ich würde verwenden Sie benutzerdefinierte Ereignisse, wenn ich verantwortlich bin für die Versendung der Veranstaltung zu, aber das ist hier nicht der Fall.
In diesem Fall würde ich speichern die URLs und Film-clips in zwei separaten Klasse arrays und verwenden Sie
innerhalb der event-handler, um die URL.
Nicht, dass es etwas falsch mit der Speicherung der Daten im movieclip, aber ich habe nicht das Gefühl, dass es ein guter Weg zu gehen. Aber die folgenden bewährten Methoden, auch wenn Sie die Dinge machen, schwierig ist es nicht eine gute Idee, entweder - Sie haben die Wahl.
InformationsquelleAutor Amarghosh
Können Sie das folgende tun, das ist im Grunde eine sauberere Art der übergabe von benutzerdefinierten Daten.
Dies ist nur eine andere Art der Verwendung von anonymen Funktionen, obwohl....
InformationsquelleAutor Sudheer
Ist es wahrscheinlich besser, Praxis, eine custom class, extends MovieClip für Ihre thumnbnail, und die thumbnail-Versand eine benutzerdefinierte Event-Klasse, die einen Ort zum speichern Ihrer Daten:
Machen Sie eine benutzerdefinierte
URLEvent
speichern können, dieurl
- Eigenschaft zusammen mit der VeranstaltungMachen eine benutzerdefinierte Miniaturansicht der Klasse speichern können, die
url
- variable und sendet eine URLEvent wenn geklickt:Jetzt können Sie Ihren
Thumbnail
Klasse zum laden jedes Bild:Diese Methode ist viel besser OOP-Praxis, wie Sie nicht brauchen, zu wissen, welche Art von Objekt Ihrer Veranstaltung.Ziel ist es, Sie wissen von den event-Typ, genau, welche Art von Daten gesendet werden bei jeder Veranstaltung.
InformationsquelleAutor Reuben
Wenn ich waren auf der Suche für diese Funktionalität, und das Tue ich oft, ich würde tempThumb eine Klasse, trugen die url-Eigenschaft. dann:
Starke Typisierung, der einfache Zugang, saubere syntax, geringe Komplexität.
InformationsquelleAutor Joel Hooks