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

Posted

技术标签:

【中文标题】从 Ember 中的控制器操作返回一个承诺?【英文标题】:Return a promise from a controller action in Ember? 【发布时间】:2014-01-15 14:30:34 【问题描述】:

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

并在FooController上实现save方法

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

如您所见,我只希望closeModal 函数在save 操作成功的情况下执行。也就是说,只有在记录保存成功的情况下才关闭模态框。

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

CoffeeScript 没问题。谢谢:) 向 sendAction 传递承诺...你真是个天才! Rawr,感觉是相互的;) 很好,易于理解,谢谢!将使用和重复使用。

以上是关于从 Ember 中的控制器操作返回一个承诺?的主要内容,如果未能解决你的问题,请参考以下文章

从 Promise 处理程序调用 Ember _super 方法

Ember 更新导致模板中的承诺不等待解决

如何在 Ember 控制器中运行操作 afterRender

控制器中的 Ember 火灾过滤器数据

承诺从我的服务中返回未定义

ember 数据 findRecord 返回值不是预期的记录