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

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

Например, допустим, у меня есть 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();
  }
}

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

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

Другие вопросы по тегам