Цель .bind (это) в конце обратного вызова AJAX?

54

Из учебника по реагированию, в чем цель .bind(this) в конце обратного вызова ajax? Правильно ли работает код без него?

        data: JSON.stringify({text: text}),
        success: function (data) {
            this.setState({data: data});
        }.bind(this),
  • 0
    Нечто подобное здесь . Без .bind(this) ссылка this становится пустой, если используется внутри пользовательской функции (определенной в компонентеactJs).
Теги:

2 ответа

56
Лучший ответ

Это гарантирует, что this будет правильным объектом внутри обратного вызова. См. Function.prototype.bind().

Альтернативой для реагирования является:

myAjaxFunction: function(){
  $.getJSON('/something', this.handleData);
},
handleData: function(data){
  this.setState({data: data});
}

Это работает, потому что React обрабатывает привязку методов компонентов для вас.

Если вы запустили свой исходный код без привязки, вы получите эту ошибку: TypeError: undefined is not a function, потому что this === window в обратном вызове

или в строгом режиме: TypeError: Cannot read property 'setState' of undefined, где this === undefined в обратном вызове.

  • 0
    Часть, специфичная для React, возможна из-за автосвязки, добавленной в 0.4: Автосвязывание по умолчанию .
  • 4
    Также нашел эту удобную статью, объясняющую варианты использования для методов bind, apply и call - javascriptissexy.com/…
2

Назначение .bind(this) в конце обратного вызова ajax позволяет this быть связанным с вашим классом реагирования. Другими словами, вы можете добавить:

var self = this;

вне ajax, и он работает одинаково. Вы код равный:

var self = this;
$.ajax({
    .
    .
    data: JSON.stringify({text: text}),
    success: function (data) {
        self.setState({data: data});
    },
    .
    .
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню