Вернуть обещание от действия контроллера в 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, я полагаю, что вы поймете или преобразуете и поймете, и я не дам вам неправильный ответ.