addEventListener und der Umfang dieses
Habe ich einen Dritten flash-Objekt, welches ich Bearbeiten können über eine javascript-API, die Sie zur Verfügung gestellt. Ich bin tryind zu hören, um ein Ereignis auf das Objekt und dann das Feuer ein Ereignis in meinem Objekt, um weitere bubble up der Veranstaltung. Ich bin zufällig zu sein, mit EXT Js, aber ich dont denke, es ist wichtig hier.
Beispielcode
this.chart.addEventListener('create', function() {
this.fireEvent('created');
}, false)
Mein problem ist, dass "this" innerhalb der anonymen Funktion bezieht sich auf das Objekt, feuerte die Veranstaltung eher als mein Objekt, dass ich möchte, um ein Ereignis auszulösen, auf.
Ihr noch weitere scope-Ausgabe. Vielen Dank im Voraus für jede Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist der typische Ansatz für dieses problem:-
var self = this;
. Sie eine Funktion erstellen und die dann ausführen, während die übergabethis
als parameter scheint ein wenig über Bord - der code ist etwas länger auch 😉self
Bezeichner beschränkt sich nur auf die Schließung, es besteht keine Gefahr, dass nachfolgende code ändern Sie den Wert in Ihr enthalten ist, bevor das Ereignis ausgelöst wird. Das ist nicht wahr dervar self = this;
Ansatz.Was über das anlegen einer externen variable, bevor die Referenzierung von "this" - Objekt.
Zum Beispiel:
that
oderself
(obwohl ich nicht glaube, das letztere ist eine gute Idee, wieself
aufgebaut hat — obwohl sinnlos — vorhandene Bedeutung in JavaScript).self
.self
ausgesetzt ist, durchwindow
eine Referenz auf sich selbst. Ich bin ziemlich froh, dass die Wiederverwendung der Bezeichner in anderen Bereichen. Es scheint mir zu tragen die richtige Bedeutung und nicht clash mit, dass es bedeutet, wennself
passiert, werden die Fenster entweder.Während die anderen Antworten erreichen, was Sie benötigt, Sie arbeiten nicht in die effizienteste (skalierbar), weil Sie letztlich nicht entkoppeln Sie das view-Objekt (
this.chart
) aus, die view-Logik (fireEvent()
). In MVC-Anwendungen, die diese Ansicht "Entscheidungen" befinden sich in einem controller. Der controller "steuert" Ansichten und enthält die APIs der Ansicht zugreifen können.In deinem Beispiel
this
ist der controller, und das ist in Ordnung (es bedeutet Sie hinzufügen Ihre Zuhörer an der richtigen Stelle). Alles, was Sie wirklich tun müssen, ist die Bindung des handlers, der Umfang der Sache, dass man den "Umgang" - in Ihrem Fall:this
:Was die anderen Antworten auf dieser Seite getan haben, wird es so gemacht Ihrer Sicht wird seine eigenen controller, aber nur beim Umgang mit "erstellen" - Ereignisse, durch die Zuordnung einer temporären Verweis auf die "controller" verwenden
var self = this
. Wieder, das funktioniert ganz gut, aber es funktioniert nicht gut im Maßstab, die in event-driven-Anwendungen, und es macht nicht wirklich Sinn machen, wenn Sie haben eine Menge von Ereignissen zu behandeln..bind()
ist eine ECMAScript-5-Implementierung. Wenn es erforderlich ist, um die Arbeit in den auch ältere Browser, eine gute Methode, dies zu tun ist hier beschrieben (mitfunctions
und.call()
): https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind.fireEvent()
) ist definiert in der Ansicht, aber der controller ruft es als notwendig. Dies könnte erlauben Ihnen, nicht verwenden.bind()
oder eine Selbstreferenz auf, sondern machen Sie Ihren handler sehr unmodular, und Ihre Anwendung würde sehr groß werden.