我有一个需要与控制器通信的组件,并且最终在之后执行一些清理控制器说一切正常(即jQuery" un" -initialization)。我认为实现这一目标的最佳方法是使用promise,以便在控制器完成任务后组件可以清理。但是控制器动作怎么能回复承诺呢?或者,组件可以直接在控制器上调用动态方法吗?
例如,假设我有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" ...}}
在FooController上实现save
方法
App.FooController = Ember.ObjectController.extend
save: ->
# how can we tell the component that this was successful?
正如您所看到的,如果closeModal
操作成功,我只希望执行save
函数。换句话说,只有在成功保存记录时才关闭模态。
这是可能的,还是我完全错了?
答案 0 :(得分:34)
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();
}
}
要小心,你要确保你没有遗漏拒绝路线,你不想让模态卡在那里,因为保存失败并且没有失败方法。
抱歉,我没有转换成咖啡脚本,我想你要么理解,要么转换和理解,我不会给你一个错误的答案。