Diese Frage bezieht sich nicht nur auf den MouseEvent.CLICK-Ereignistyp, sondern auf alle Ereignistypen, die bereits in AS3 vorhanden sind. Ich habe viel über benutzerdefinierte Ereignisse gelesen, aber bis jetzt konnte ich nicht herausfinden, wie ich das machen soll, was ich tun möchte. Ich werde versuchen zu erklären, ich hoffe du verstehst:
Hier ist eine Illustration meiner Situation:
%Vor%Aber ich möchte in der Lage sein, someVar als Parameter an doSomething zu übergeben. Also habe ich das versucht:
%Vor%Diese Art von Arbeiten, aber nicht so, wie ich es erwarte. Wenn die MouseEvent.CLICK-Ereignisse tatsächlich ausgelöst werden, ist die for -Schleife aufgrund der Funktionsverschlüsse bereits beendet und someVar enthält den letzten Wert, die Zahl 9 im Beispiel. Daher ruft jeder Klick in jedem Movieclip doSomething auf, wobei 9 als Parameter übergeben wird. Und es ist nicht was ich will.
Ich dachte, dass das Erstellen eines benutzerdefinierten Ereignisses funktionieren sollte, aber dann konnte ich keine Möglichkeit finden, ein benutzerdefiniertes Ereignis auszulösen, wenn das MouseEvent.CLICK-Ereignis ausgelöst wird, und den Parameter an es übergeben. Jetzt weiß ich nicht, ob es die richtige Antwort ist.
Was soll ich tun und wie?
Ohne mehr über Ihre Anwendung zu wissen, scheint es eher so, dass Sie das Ziel verwenden sollten, um Parameter zu übergeben oder MouseEvent zu erweitern. Ersteres würde eher mit der üblichen Praxis übereinstimmen. Wenn Sie beispielsweise eine ganzzahlige public-Eigenschaft für Ihr "clip" -Objekt (was auch immer es ist) verfügbar gemacht haben:
%Vor%... und dann könnten Sie diese Eigenschaft in Ihrem Ereignis-Listener mithilfe der target- oder currentTarget-Eigenschaft des Ereignisses abrufen (in Ihrem Fall wahrscheinlich currentTarget):
%Vor%Das sollte es tun! Viel Glück.
Sie müssen die Ereignisklasse wirklich erweitern, um ein eigenes Ereignis mit zusätzlichen Parametern zu erstellen. Das Platzieren von Funktionen innerhalb des addEventListeners (anonyme Funktionen) ist ein Rezept für Speicherlecks, was nicht gut ist. Sehen Sie sich Folgendes an.
%Vor%, wenn Sie ein neues Ereignis erstellen, z. B.
%Vor%Sie können dann auf dieses Ereignis wie folgt hören
%Vor%und innerhalb der Funktion 'listenerFunction' event.parameterText wird Ihren Parameter enthalten.
In Ihrer myClips-Komponente würden Sie also das benutzerdefinierte Ereignis auslösen und auf dieses Ereignis und nicht auf das Click-Ereignis warten.
Sie können dies erreichen, indem Sie Ihren Handler aus einer Funktion entfernen, die die Variable schließt, wie folgt:
%Vor%Auch warum dies eine neue Schließung verursacht, sollten Sie die Erklärung in der akzeptierten Antwort zu diese ähnliche Frage .
Vielen Dank für diese nützlichen Tipps, diese Technik ist besser zu verstehen als Klassen Erklärung.
für mich Ich habe gerade einen neuen Code-Algorithmus mit dieser Technik gestartet, um die Link-Beziehung zwischen Timer-Array und Viewports-Array zu lösen und den Status durch Ändern von Text in ihnen häufig zu aktualisieren, indem IDs mit Timer-Events übergeben werden.
so:
%Vor%Ich sehe, dass Ihr Hauptziel nicht darin besteht, ein benutzerdefiniertes MouseEvent.CLICK zu erstellen, sondern einen Parameter an die Funktion zu übergeben. Sie müssen nicht kompliziert etwas erstellen oder erweitern. Es gibt einen einfachen und problemlosen Weg, es zu tun.
Mach einfach deine Funktion so:
%Vor%Diese Technik kann sich auf jeden AS3-Ereignistyp beziehen, für den Sie addEventListener verwenden können.
Und jetzt können Sie es wie folgt hinzufügen:
%Vor% Das doSomething(someVar)
kann direkt auf addEventListener()
verwendet werden, aber es ist besser, es in einer Variablen zu belassen, da Sie es später auf die gleiche Weise entfernen können, wie Sie es hinzugefügt haben:
Das häufig verwendete e.currentTarget.someCustomProperty
funktioniert für dynamische Objekte (d. h. MovieClip), lässt Sie aber bei etwas anderem (z. B. Sprite) hängen und zwingt Sie, ein ganzes benutzerdefiniertes erweitertes Objekt / Ereignis für jeden Typ zu erstellen.
Diese Lösung behandelt jedes "hörbare" Objekt und Ereignis. Und diese Antwort enthält weitere Details und Beispiele dazu.
Tags und Links flash events closures actionscript-3 flex