jQuery.proxy () использование

Я читал API о jQuery.proxy(). Это выглядит многообещающим, но я задавался вопросом в том, какая ситуация является этим лучшим использованием. Кто-либо может просветить меня?

68
задан Machavity 4 November 2015 в 20:45
поделиться

3 ответа

Если вам нужна функция, которая имеет значение this , привязанное к определенному объекту. Например, в обратных вызовах, таких как обработчики событий, обратные вызовы AJAX, тайм-ауты, интервалы, настраиваемые объекты и т. Д.

Это всего лишь искусственный пример ситуации, в которой это может быть полезно. Предположим, что существует объект Person , у которого есть имя свойства. Он также связан с элементом ввода текста, и всякий раз, когда значение ввода изменяется, имя в этом объекте человека также обновляется.

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.
    });
}

Одно из решений, которое мы часто используем, - сохранить контекст this в переменной и использовать его внутри функции обратного вызова, например:

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
    });
}

В качестве альтернативы мы могли бы использовать здесь jQuery.proxy , чтобы ссылка to this относится к объекту Person, а не к элементу, вызвавшему событие.

function Person(el) {
    this.name = '';

    $(el).change(jQuery.proxy(function(event) {
        this.name = event.target.value;
    }, this));
}

Обратите внимание, что эта функция была стандартизирована в ECMAScript 5, который теперь включает метод bind , заимствованный из и уже доступный в некоторых браузерах.

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
}
135
ответ дан 24 November 2019 в 14:09
поделиться

Это просто сокращенный метод установки контекста для закрытия, например:

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

Однако часто мы хотим, чтобы this оставался таким же, как и метод, которым мы пользовались. , для которого используется $. proxy () , например:

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

Обычно он используется для отложенных вызовов или в любом другом месте, где вы не хотите использовать длинный метод объявления закрытия. Строковый метод указания контекста на объект ... ну, я еще не встречал практического использования в повседневном коде, но я уверен, что есть приложения, просто зависит от вашей структуры объекта / события.

17
ответ дан 24 November 2019 в 14:09
поделиться

Например, если вы хотите создать обратные вызовы. Вместо:

var that = this;

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

вы можете:

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

Или, если вы создаете плагин, который принимает обратные вызовы, и вы должны установить определенный контекст для обратного вызова.

14
ответ дан 24 November 2019 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: