Результат Coffeescript $ .ajax показан как неопределенный - PullRequest
0 голосов
/ 13 декабря 2011

Я работаю с интерфейсом и хочу отрисовать страницу.Для этого я использую инициализатор, который вызывает функцию, выполняющую вызов $ .ajax для бэкэнда.Однако, хотя в chrome dev tools запрос выполняется успешно, каждый раз, когда я запускаю console.log, он возвращает undefined.Бэкэнд отправляет правильный результат, но он не отображается.

  initialize: =>
    @build_recent()
    @payload=@recent_data
    console.log(@payload)

  render: =>
    $(@el).append homeTemplate(@payload)
    @

  build_recent: =>
    $.ajax(
      url: '/build_recent'
      dataType: 'text/json'
      type: 'GET'
      success: (data) =>
        @recent_data = data
    )

Обновление:

просто только с использованием render () без использования intialize и другой функции, я наконец решил проблему следующим образом:

  render: =>
    $.ajax(
      url: '/build_recent/'
      dataType: 'json'
      type: 'GET'
      success: (data) =>
        @payload = data
        $(@el).append homeTemplate(@payload)
        return @
    )

получается, что проблема была только в этом dataType: 'json', ранее я использовал dataType: 'text/json'

, теперь он работает нормально

1 Ответ

3 голосов
/ 13 декабря 2011

Ваш coffeescript отображает:

var _this = this;

({
  initialize: function() {
    _this.build_recent();
    _this.payload = _this.recent_data;
    return console.log(_this.payload);
  },
  render: function() {
    $(_this.el).append(homeTemplate(_this.payload));
    return _this;
  },
  build_recent: function() {
    return $.ajax({
      url: '/build_recent',
      dataType: 'text/json',
      type: 'GET',
      success: function(data) {
        return _this.recent_data = data;
      }
    });
  }
});

И Вы не можете возвратиться из оператора ajax.Вы должны использовать обратный вызов!

Таким образом, ваш обработанный js-код можно изменить на:

({
  initialize: function() {
    _this.build_recent();
    //moved into callback
  },
  render: function() {
    $(_this.el).append(homeTemplate(_this.payload));
    return _this;
  },
  build_recent: function() {
    return $.ajax({
      url: '/build_recent',
      dataType: 'text/json',
      type: 'GET',
      success: function(data) {
        _this.recent_data = data;
        //in callback
        _this.payload = _this.recent_data;
        console.log(_this.payload);
        //prob want to render:
        _this.render();
      }
    });
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...