Ich lese die API über jQuery.proxy()
. Es sieht vielversprechend aus, aber ich frage mich, in welcher Situation dies am besten ist. Kann mich jemand aufklären?jQuery.proxy() Verwendung
Antwort
Wenn Sie eine Funktion wünschen, die den Wert this
an ein bestimmtes Objekt gebunden hat. Zum Beispiel in Rückrufen wie Event-Handlern, AJAX-Rückrufen, Timeouts, Intervallen, benutzerdefinierten Objekten usw.
Dies ist nur ein Beispiel für eine Situation, in der es nützlich sein könnte. Angenommen, es gibt ein Person
Objekt, das einen Eigenschaftsnamen hat. Es ist auch mit einem Texteingabeelement verknüpft, und wenn sich der Eingabewert ändert, wird auch der Name in diesem Personenobjekt aktualisiert.
function Person(el) {
this.name = '';
$(el).change(function(event) {
// Want to update this.name of the Person object,
// but can't because this here refers to the element
// that triggered the change event.
});
}
Eine Lösung, die wir häufig verwenden, um die diesen Zusammenhang in einer Variablen zu speichern und diese Funktion innerhalb der Callback verwenden wie:
function Person(el) {
this.name = '';
var self = this; // store reference to this
$(el).change(function(event) {
self.name = this.value; // captures self in a closure
});
}
Alternativ könnten wir jQuery.proxy
hier so die Referenz verwendet haben to this
bezieht sich auf das Objekt Person anstelle des Elements, das das Ereignis ausgelöst hat.
function Person(el) {
this.name = '';
$(el).change(jQuery.proxy(function(event) {
this.name = event.target.value;
}, this));
}
Beachten Sie, dass diese Funktion in ECMAScript 5 standardisiert wurde, die nun die von prototypejs entlehnt bind
Verfahren beinhaltet und ist bereits auf einigen Browsern verfügbar.
function Person(el) {
this.name = '';
$(el).change(function(event) {
this.name = event.target.value;
}.bind(this)); // we're binding the function to the object of person
}
+1 für die Erwähnung, dass diese ihren Weg in ECMAscript gefunden haben. –
Ist es * besser * (schneller, effizienter), einen regulären Abschluss zu verwenden oder $ .proxy zu verwenden? –
@AnsonMacKeracher es ist besser und schneller, keine Schließung zu verwenden, sondern eine statische Funktion. Diese Antworten zeigen nicht, dass Proxy mit statischen Funktionen verwendet werden kann, da der 'self = this' -Hack nur verwendet werden kann, wenn Sie die Funktion inline erstellen – Esailija
Zum Beispiel, wenn Sie Rückrufe erstellen möchten. Statt:
var that = this;
$('button').click(function() {
that.someMethod();
});
können Sie tun:
$('button').click($.proxy(this.someMethod, this));
Oder wenn Sie ein Plugin erstellen, die Rückrufe akzeptiert und Sie müssen einen spezifischen Kontext für den Rückruf eingestellt.
Es ist nur ein verkürztes Verfahren den Kontext für eine Schließung Einstellung, zum Beispiel:
$(".myClass").click(function() {
setTimeout(function() {
alert(this); //window
}, 1000);
});
jedoch oft wollen wir this
das gleiche wie das Verfahren zu bleiben, in der wir waren, die $.proxy()
für verwendet wird, wie dies:
$("button").click(function() {
setTimeout($.proxy(function() {
alert(this); //button
}, this), 1000);
});
Es ist in der Regel für die verzögerte Anrufe verwendet wird, oder wo immer Sie wollen keine Langschrift Verfahren zur Vereinbarkeit eines Verschlusses zu tun. Die String-Methode, um den Kontext auf ein Objekt zu verweisen ... nun, ich bin noch nicht auf eine praktische Verwendung im alltäglichen Code gestoßen, aber ich bin sicher, dass es Anwendungen gibt, hängt nur davon ab, was Ihre Objekt-/Event-Struktur ist.
- 1. jQuery.proxy vs. underscore.bind
- 2. UTL_FILE Serverseitige Verwendung/clientseitige Verwendung
- 3. Verwendung von "Verwendung" Anweisung zu entsorgen
- 4. Verwendung des Spaltennamens bei Verwendung von SqlDataReader.IsDBNull
- 5. ContentResolver Verwendung
- 6. Robots.txt Verwendung
- 7. MPI_Scatter Verwendung
- 8. LauncherActivity Verwendung
- 9. Verwendung Intent.ATTACH_DATA
- 10. check_immediate Verwendung
- 11. e.Graphics Verwendung
- 12. SetProcessWorkingSetSize Verwendung
- 13. Verwendung _CrtDumpMemoryLeaks()
- 14. Verwendung @ ActivityInfo.ScreenOrientation
- 15. springdoclet Verwendung?
- 16. Verwendung oft
- 17. In Bezug auf die Verwendung von ManualResetEvent Verwendung C#?
- 18. MySQL - 'Verwendung der Indexbedingung' vs 'Verwendung wo; Index '
- 19. Argarse: Verbergen der Verwendung bei Verwendung von argparse.ArgumentTypeError
- 20. leere Seite bei der Verwendung der Verwendung Schlüsselwort in PHP
- 21. Verwendung von SpringTemplateEngine bei Verwendung von Spring Boot
- 22. Praktische Verwendung der Verwendung von aws api Gateway-Produktion
- 23. Verwendung des Kopierkonstruktors erzwingen/Verwendung des Kopierkonstruktors vermeiden
- 24. unerwartete "Verwendung" (T_USE) bei der Verwendung von Composer
- 25. PubNub Verwendung, Swift 2.0 Update "Mehrdeutige Verwendung von 'tiefgestellten'" + "Sorted"
- 26. Die Verwendung der Konfigurationsdatei entspricht der Verwendung von Globals?
- 27. Verwendung von Crashlytics ohne Verwendung von Fabric in iOS
- 28. Warum ist die seltsame Verwendung für ns/Verwendung mit Clojure?
- 29. Verwendung von "this" in anonymous, IDE: möglicherweise ungültige Verwendung
- 30. OpenID Verwendung in Unternehmensumgebungen?
Siehe auch http://stackoverflow.com/a/4986562 für eine große Erklärung – Paul