Um einen Parameter im AS3 an den Ereignis-Listener zu übergeben, ist der einfache Weg ... vorhanden?
Erwartet /pseudo Beispiel:
stage.addEventListener(MouseEvent.CLICK, onClick.someWayToPassParameters(true, 123, 4.56, "string"));
function onClick(e:MouseEvent):void {
trace("Received " + someWayToRetrieveParameters().b/i/n/s + ".");
}
Seit vielen Jahren (3~4), auf jeder website, forum, blog, wo immer ich suchte, die Leute sagen mir es gibt keinen einfachen Weg, dies zu tun. Sie in der Regel vorschlagen:
-
Fügen Sie den Zuhörer zu einem dynamischen Objekt, wo Sie den Wert festlegen, um eine zusätzliche Eigenschaft und Verweis (e.Ziel.Grundstück /e zu.currentTarget.Eigentum) in die Funktion.
Nicht alle Klassen sind dynamisch. Es wird nicht funktionieren, auf ein Sprite, zum Beispiel.
-
Erweitern Sie die Klasse des Objekts mit einer benutzerdefinierten Klasse, die Eigenschaft hinzufügen oder einfach nur machen es dynamisch.
Müssen Sie erstellen eine ganz neue tweak class everytime.
-
Verwenden Sie eine anonyme Funktion als event-handler.
Gibt es keine Referenz (und es ist hässlich). Um den listener entfernen, um Ressourcen freizugeben, die Sie gezwungen sind, es zu tun, von innerhalb der Funktion selbst mit Argumenten.angerufene.
-
Eine andere Funktion aufrufen, die Verwendung der parameter innerhalb der event-handler.
Ist und wo der event-handler-Aufruf führt der parameter gehen?
-
Halten Sie die event-handler im gleichen Bereich wie die parameter.
Verletzung zu einem totalen semantischen Chaos.
-
Kapseln beide event-handler-definition, und Sie addEventListener () - Aufruf in einer Funktion empfängt die Ziel-und Kenngrößen.
Kann es-mix-Bereiche, aber es ist eng. Sie müssen vorsichtig sein, obwohl.
...Unter vielen anderen vorgeschlagenen workarounds.
Alles was ich will ist nur zu pass ein argument zu den event-handler, so dass ich es verwenden kann in seiner Funktion, genau wie eine normale Funktion!
Bin ich zu viel verlangt?
InformationsquelleAutor der Frage user985358 | 2012-11-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Out of the box: es dauert nur 2 zusätzliche Zeilen eleganten Codes zur Lösung dieses alten Rätsels.
Aber am wichtigsten ist, werden Sie sehr wahrscheinlich benötigen, um den listener entfernen später, um Ressourcen freizugeben, so +1 Zeile, um es zu speichern in eine variable:
Und Sie werden in der Lage sein, um es zu entfernen in der Regel:
Hier ist eine mehr ausgearbeitete, dynamische Beispiel zu beweisen:
Keine Eigenschaften durch dynamische Objekte, die keine eigene Klasse, keine losen Funktionen, kein Bereich überlappen. Nur, was Logik erwartet: Sie sind einfach Argumente übergeben.
Und entfernen Sie alle listener richtig, Sie können es tun, wie dies später:
IMHO ist dies die einfachste, aber auch solideste Weg, es zu tun.
InformationsquelleAutor der Antwort
hier ist ein Beispiel
InformationsquelleAutor der Antwort xbraim
Einen parameter übergeben direkt an den event-handler ist nicht möglich.
Die beste Näherung wird durch eine Funktion verwenden, die factory-Methode, IMO
//--EDITIERT:
Ich erstellte eine separate Klasse zu halten parametrisierte Prozeduren finden Sie unter https://gist.github.com/4124722
Nutzung ist einfach:
Jetzt können Sie sich registrieren parametrisierten Prozeduren mit
ParameterizedHandlerContainer#registerHandler
und zerstören Sie Sie mitParameterizedHandlerContainer#destroyHandler
.Können Sie jede Menge Parameter, die Sie wollen, aber der erste parameter der callback-Methode muss vom Typ Ereignis oder ein Nachkomme.
InformationsquelleAutor der Antwort Creynders
Ich ändern würde, Creynders Beispiel leicht:
diesem Weg können Sie original-event-Handler und injizieren Sie die "Argumente",
auch Sie könnte Ihren Handler, um haben folgende Signatur:
dann könnte man Argumente übergeben, die direkt auf das Ziel-hf:
beste Grüße
InformationsquelleAutor der Antwort Lukasz 'Severiaan' Grela
Warum nicht AS3-Signale? Ein parameter übergeben wird, dann ist so einfach wie:
InformationsquelleAutor der Antwort Varnius