2012-02-05 3 views
5

У меня есть небольшая проблема в программировании объекта в JavaScript«это» ссылки на JavaScript

Там является «класс» задачи, он имеет несколько методов, метод, содержащий асинхронную отправку запроса с помощью JQuery ($.ajax). После успешного выполнения запроса необходимо выполнить конкретный метод (например, successFunction) класса Task.

Проблема заключается в том, после запроса в теле successFunction это невозможно, чтобы обратиться к классу с помощью ключевого слова this, потому что контекст изменился, и это содержит ссылку на Jquery-объекта, который выполняет ajax-request.

Какие варианты относятся к текущему объекту задачи внутри функции, которая не вызвана напрямую, а внешне существует? (Например, событием или ajax)

ответ

9

Обычно в событии AJAX, таком как обратный вызов успеха, this относится к объекту, возвращаемому вызовом $.ajax. Вы можете использовать параметр context для изменения контекста в успехе обратного вызова:

$.ajax({ 
    url: '/foo', 
    context: this, // <!-- change the context of the success callback 
    success: function(result) { 
     // 'this' here will refer to whatever it refered outside 
    } 
}); 

Вы также мог бы пройти сложные объекты:

$.ajax({ 
    url: '/foo', 
    context: { element: this, foo: 'bar' }, 
    success: function(result) { 
     // you can use 'this.element' and 'this.foo' here 
    } 
}); 
+0

Спасибо, это именно то, что мне нужно. – JN0iZzze

7

Вы можете определить переменные, которая хранит ссылку на объект:

function Task() { 
    var that = this; 
    this.call = function() { 
    $.ajax({ 
     url: '/foo', 
     success: function(result) { 
     console.log(that); // <-- you cann access this object via that 
     } 
    }); 
    }; 
} 
+0

+1, для 'that'. –

+0

+1, Crockford 'that' style. – dwerner

Смежные вопросы