2012-02-05 5 views
5

Mam mały problem w programowania obiektowego w JavaScript„this” odniesienia w JavaScript

istnieje „klasa” Zadanie to ma kilka metod, sposób zawierający asynchroniczne wysłanie żądania z pomocą jQuery ($.ajax). Po pomyślnym zakończeniu żądania konieczne jest wykonanie określonej metody (np. SuccessFunction) klasy Task.

Problem polega na tym, po zapytaniu w organizmie successFunction to niemożliwe, aby odnieść się do klasy przy użyciu słowa kluczowego this, ponieważ kontekst się zmienił, a to zawiera odniesienie do jQuery obiektu który wykonuje ajax-request.

Jakie warianty odnosić się do bieżącego obiektu zadania wewnątrz funkcji, która nie została wywołana bezpośrednio, ale zewnętrznie? (Na przykład przez zdarzenie lub ajax)

Odpowiedz

9

Zwykle w zdarzeniu AJAX, takim jak oddzwonienie o powodzeniu, this odnosi się do obiektu zwróconego przez wywołanie $.ajax. Można użyć parametru context zmienić kontekst wywołania zwrotnego sukcesu:

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

Można również przechodzić skomplikowanych obiektów:

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

Dzięki, to jest dokładnie to, czego potrzebuję. – JN0iZzze

7

Można zdefiniować zmienną, która przechowuje odwołanie do obiektu:

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, dla "tego". –

+0

+1, Crockford "ten" styl. – dwerner