2012-04-01 7 views
5

He buscado esto y no puedo encontrar una respuesta exitosa, estoy usando una llamada jQuery ajax y no puedo obtener la respuesta a la devolución de llamada.Coffeescript obteniendo el alcance correcto del método de devolución de llamada

Aquí está mi código CoffeeScript:

initialize: (@blog, @posts) -> 
    _url = @blog.url 
    _simpleName = _url.substr 7, _url.length 
    _avatarURL = exports.tumblrURL + _simpleName + 'avatar/128' 
    $.ajax 
     url: _avatarURL 
     dataType: "jsonp" 
     jsonp: "jsonp" 
     (data, status) => handleData(data) 

handleData: (data) => 
    console.log data 
    @avatar = data 

Aquí está la JS compilado:

Blog.prototype.initialize = function(blog, posts) { 
    var _avatarURL, _simpleName, _url, 
     _this = this; 
    this.blog = blog; 
    this.posts = posts; 
    _url = this.blog.url; 
    _simpleName = _url.substr(7, _url.length); 
    _avatarURL = exports.tumblrURL + _simpleName + 'avatar/128'; 
    return $.ajax({ 
     url: _avatarURL, 
     dataType: "jsonp", 
     jsonp: "jsonp" 
    }, function(data, status) { 
     return handleData(data); 
    }); 
    }; 

    Blog.prototype.handleData = function(data) { 
    console.log(data); 
    return this.avatar = data; 
    }; 

He intentado una docena de variaciones y no puedo encontrar la manera de escribir esto?

Gracias.

Respuesta

2

Sus argumentos son incorrectos, usted está pasando la devolución de llamada como el segundo parámetro a $.ajax. Debería pasarlo como success: en las opciones, o agregarlo al objeto diferido Ajax.

Dado que handleData parece que está adjuntado a un objeto, que es probable this, debe marcarlo con @.

Mientras su forma de pasar la URL funciona, la API ahora sugiere pasar la URL como primer param y las opciones como el segundo.

$.ajax _avatarURL, 
    dataType: "jsonp" 
    jsonp: "jsonp" 
    success: (data, status) => @handleData(data) 

O

$.ajax _avatarURL, 
    dataType: "jsonp" 
    jsonp: "jsonp" 
.done (data) => @handleData(data) 
+0

mismo aquí ** handleData ** nunca se llama simplemente devuelve un método, no el retorno de ** handleData ** – pandabrand

+0

Lo sentimos, ¿qué devuelve un método? ¿inicializar? Para que quede claro, en este momento initialize devolverá un objeto jQuery jqXHR. http://api.jquery.com/Types/#jqXHR. No hay datos devueltos. – loganfsmyth

+0

Lo siento, tenías razón, solo necesitaba otra taza de café. ;-) – pandabrand

2

Desde handleData está en prototipo Blog 's, no una variable en su alcance, es probable que desee esto:

(data, status) => @handleData(data) 
+0

el método nunca se ejecuta simplemente devuelve el método ** ** No handleData el rendimiento real de ese método. – pandabrand

Cuestiones relacionadas