Coffeescript получает правильную область видимости от метода обратного вызова - PullRequest
5 голосов
/ 01 апреля 2012

Я искал это и, кажется, не могу найти успешный ответ, я использую ajax-вызов jQuery и не могу получить ответ на обратный вызов.

Вот мой код кофейного кода:

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

Вот скомпилированный JS:

  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;
  };

Я пробовал дюжину вариантов, и я не могу понять, как это написать?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 01 апреля 2012

Ваши аргументы неверны, вы передаете обратный вызов в качестве второго параметра $.ajax. Вы должны передать его как success: в опциях или добавить его к отложенному объекту Ajax.

Так как handleData выглядит так, как будто он прикреплен к объекту, что, вероятно, this, вам необходимо добавить к нему префикс @.

Пока ваш способ передачи URL работает, API теперь предлагает передавать URL-адрес в качестве первого параметра, а параметры - в качестве второго.

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

OR

$.ajax _avatarURL,
  dataType: "jsonp"
  jsonp: "jsonp"
.done (data) => @handleData(data)
2 голосов
/ 01 апреля 2012

Поскольку handleData находится в прототипе Blog, а не является переменной в области видимости, вы, вероятно, захотите следующее:

(data, status) => @handleData(data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...