Verwendung von jQuery.proxy ()


Antworten:


139

When you want a function that has the this value bound to a specific object. For example, in callbacks such as event handlers, AJAX callbacks, timeouts, intervals, custom objects, etc.

Dies ist nur ein Beispiel für eine Situation, in der dies nützlich sein könnte. Vorausgesetzt, es gibt einePerson object which has a property name. It is also linked to a text input element, and whenever the input value changes, the name in this person object gets updated too.

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 häufig verwendete Lösung besteht darin, diesen Kontext in einer Variablen zu speichern und diese in der Rückruffunktion zu verwenden, z.

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 hätten wir jQuery.proxyhier auch den Verweis thisauf das Objekt der Person anstelle des Elements verwenden können, 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, das jetzt das enthält bind entliehene Methode und ist in einigen Browsern bereits 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
}

34
+1 für die Erwähnung, dass dies seinen Weg in ECMAscript gefunden hat.
Mike Sherov

1
Ist es besser (schneller, effizienter), einen regulären Abschluss oder $ .proxy zu verwenden?
Anson MacKeracher

4
@AnsonMacKeracher Es ist besser und schneller, überhaupt keinen Verschluss zu verwenden, sondern eine statische Proxy-Funktion. Diese Antworten zeigen nicht, dass Proxy mit statischen Funktionen self = thisverwendet werden kann, da der Hack nur verwendet werden kann, wenn Sie die Funktion inline erstellen
Esailija

3
Um noch einen Schritt weiter zu gehen, sind in ECMAScript 6 (ES6) Pfeilfunktionen der richtige Weg ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ) `function Person (el) {this. name = ''; $ (el) .change ((event) => {this.name = event.target.value;}); } `
TypingTurtle

17

Dies ist nur eine Kurzmethode zum Festlegen des Kontexts für einen Abschluss, zum Beispiel:

$(".myClass").click(function() {
  setTimeout(function() {
    alert(this); //window
  }, 1000);
});

Wie oft wir auch thisbleiben wollen , wir wollen die Methode bleiben, für die wir verwendet wurden $.proxy():

$("button").click(function() {
  setTimeout($.proxy(function() {
    alert(this); //button
  }, this), 1000);
});​

Es wird normalerweise für verspätete Anrufe oder überall dort verwendet, wo Sie keine Langstreckenmethode zum Deklarieren einer Schließung durchführen möchten. Die Zeichenfolgenmethode zum Verweisen des Kontexts auf ein Objekt ... Nun, ich habe noch keine praktische Verwendung im täglichen Code gefunden, aber ich bin sicher, dass es Anwendungen gibt, hängt nur davon ab, wie Ihre Objekt- / Ereignisstruktur aussieht.


14

Zum Beispiel, wenn Sie Rückrufe erstellen möchten. Anstatt von:

var that = this;

$('button').click(function() {
    that.someMethod();
});

du kannst tun:

$('button').click($.proxy(this.someMethod, this));

Oder wenn Sie ein Plugin erstellen, das Rückrufe akzeptiert und einen bestimmten Kontext für den Rückruf festlegen müssen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.