繁体   English   中英

从Ember的控制器动作返回一个承诺?

[英]Return a promise from a controller action in Ember?

我有一个组件需要与控制器通信,并最终在控制器说一切正常执行一些清理(即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?

如您所见,我只希望在save操作成功时执行closeModal函数。 换句话说,只有在成功保存记录时才关闭模态。

这是可能的,还是我完全错了?

sendsendAction是单行道,可以说,你可以发送一个延迟动作并期望它解决/拒绝它。

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();
  }
}

要小心,你要确保你不要忽略拒绝路线,你不想让模态卡在那里,因为保存失败并且没有失败的方法。

对不起,我没有转换成咖啡脚本,我想你要么理解,要么转换和理解,我不会给你一个错误的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM