【问题标题】:Return a promise from a controller action in Ember?从 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 操作成功的情况下执行。也就是说,只有在记录保存成功的情况下才关闭模态框。

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

【问题讨论】:

    标签: javascript ember.js


    【解决方案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,感觉是相互的;)
    • 很好,易于理解,谢谢!将使用和重复使用。
    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 2016-07-27
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2019-07-30
    相关资源
    最近更新 更多