簡體   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