2012-02-05 10 views
5

Tengo un pequeño problema en la programación de objetos en javascript'esto' referencia en JavaScript

hay una "clase" de tareas, que cuenta con varios métodos, un método que contiene un envío de una solicitud con una ayuda de jQuery asíncrono ($.ajax). Después de que la solicitud sea exitosa, es necesario realizar un método particular (por ejemplo, successFunction) de la clase Task.

El problema es, después de la consulta en el cuerpo de successFunction que es imposible hacer referencia a la clase usando la palabra clave this, porque el contexto ha cambiado, y esto contiene una referencia a la jQuery a objetos que realiza una ajax-request.

¿Qué variantes se refieren al objeto Task actual dentro de una función que no fue causada directamente sino externamente? (Por ejemplo, por un evento o ajax)

Respuesta

9

Normalmente dentro de un evento AJAX como la devolución de llamada correcta, this se refiere al objeto devuelto por la llamada $.ajax. Se podría utilizar el parámetro context para cambiar el contexto de la devolución de llamada de éxito:

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

También podría pasar objetos complejos:

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

Gracias, eso es exactamente lo que necesito. – JN0iZzze

7

Se puede definir una variable que contiene la referencia al objeto:

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, para 'eso'. –

+0

+1, Crockford 'ese' estilo. – dwerner

Cuestiones relacionadas