Вернуть обещание от действия контроллера в Ember?

У меня есть компонент, который должен связываться с контроллером и, в конечном счете, выполнять некоторую очистку после того, как контроллер говорит, что все в порядке (т.е. jQuery "un" -инициализация). Я думаю, что лучший способ добиться этого - с обещанием, чтобы компонент мог очистить после того, как контроллер выполнит свою задачу. Но как действие контроллера может дать обещание? В качестве альтернативы, может ли компонент вызвать динамический метод непосредственно на контроллере?

Например, скажем, у меня есть ModalDialogComponent.

App.ModalDialogComponent = Ember.Component.extend
  didInsertElement: -> 
    @$('.modal').modal('show')

  actions:
    save: ->
      @sendAction('save').then(@closeModal.bind(@))

    # some other actions are omitted

  closeModal: ->
    @$('.modal').modal('hide')

И я могу создать экземпляр компонента внутри шаблона с именем foo,

{{modal-form save="save" ...}}

И реализуем метод save на FooController

App.FooController = Ember.ObjectController.extend
  save: ->
    # how can we tell the component that this was successful?

Как вы можете видеть, я хочу, чтобы функция closeModal выполнялась, если действие save было успешным. Другими словами, только закрыть модальный, если запись была успешно сохранена.

Возможно ли это, или я полностью ошибаюсь?

Ответы

Ответ 1

send и sendAction - это односторонние улицы, которые, как говорится, вы можете отправить отложенное действие и ожидать, что он разрешит/отклонит его.

var defer = Ember.RSVP.defer();

defer.promise.then(function(resolvedValue){
  alert(resolvedValue); 
});

setTimeout(function(){
  defer.resolve('hello world');
},2000);

У вас будет немного похоже на

var defer = Ember.RSVP.defer(),
    self = this;

defer.promise.then(function(){
  self.closeModal();
},
function(){
  alert('error');
});

this.sendAction('save', defer);

сохранить действие

actions: {
  save: function(defer){

    // if succeeded 
    defer.resolve();

    // or if failure occurs 
    defer.reject();
  }
}

Будьте осторожны, вы хотите удостовериться, что вы не отказываетесь от маршрута отклонения, вам не хотелось бы, чтобы модальность застряла там, потому что сбой не удалось, и не было способа отказа.

Извините, я не конвертировал в кофе script, я полагаю, что вы поймете или преобразуете и поймете, и я не дам вам неправильный ответ.