Ember.js Evented Controller запускающий событие

Я пытаюсь вызвать событие из контроллера Ember.js, чтобы прослушиваемые представления могли обновляться. Вот Coffeescript.

window.CMS.EdmController = Ember.ObjectController.extend Ember.Evented,
  actions:
   save_edm: ->
     postData = $('#edm_form').serialize()
     $.ajax(
       url: 'cms2/update_edm',
       type: 'POST',
       data: postData
       )
       .done ->
         console.log(@)
         @trigger('saveEdmSuccessful')

Сбой с ошибкой. Объект #Object не имеет триггера метода. @ В функции.done относится к объекту публикации jQuery, а не к контроллеру.

Как получить ссылку на родительский объект контроллера из обратного вызова jQuery?

Любое руководство будет оценено.

1 ответ

Решение

Я попытался скомпилировать ваш Coffeescript и в итоге получил следующий код:

window.CMS.EdmController = Ember.ObjectController.extend(Ember.Evented, {
  actions: {
    save_edm: function() {
      var postData;
      postData = $('#edm_form').serialize();
      return $.ajax({
        url: 'cms2/update_edm',
        type: 'POST',
        data: postData
      }).done(function() {
        console.log(this);
        return this.trigger('saveEdmSuccessful');
      });
    }
  }
});

И решение проблемы, с которой вы сталкиваетесь, связано не с ember.js, а с тем, как работают закрытия Javascript. Решение вышеупомянутой проблемы было бы:

window.CMS.EdmController = Ember.ObjectController.extend(Ember.Evented, {
  actions: {
    save_edm: function() {
      var postData;
      postData = $('#edm_form').serialize();
      return $.ajax({
        url: 'cms2/update_edm',
        type: 'POST',
        data: postData
      }).done($.proxy(function() {
        console.log(this);
        return this.trigger('saveEdmSuccessful');
      },this));
    }
  }
});

Обратите внимание, как я заменил ваш .done обработчик от вызова функции к вызову прокси. Это гарантирует, что при выполнении обратного вызова контекст обновляется, чтобы отразить текущий this,

Чтобы понять дальше о поведении this в JavaScript, прочитайте эту статью.

Для справки, вот эквивалент CoffeeScript моего решения:

window.CMS.EdmController = Ember.ObjectController.extend Ember.Evented,
  actions:
   save_edm: ->
     postData = $('#edm_form').serialize()
     $.ajax(
       url: 'cms2/update_edm',
       type: 'POST',
       data: postData
       )
       .done(
          $.proxy ->
            console.log(@)
            @trigger('saveEdmSuccessful')
          @
       )
Другие вопросы по тегам