2014-05-18 16 views
7

我有一個很常見的情況:有一個髒模型,我想顯示一個確認,如果用戶試圖轉換到任何其他路線。Ember.js:如何防止使用異步確認的髒模型轉換?

我有這樣的事情與window.confirm確認對話框的工作:如果我想使用異步確認(例如bootbox.js確認)

var EventRoute = Ember.Route.extend({ 
    actions: { 
    willTransition: function(transition) { 
     var event = this.modelFor(this.routeName); 
     if (event.get('isDirty') && !confirm("Are you sure?")) { 
     transition.abort(); 
     } else { 
     event.rollback(); 
     return true; 
     } 
    } 
    } 
}); 

但是,我怎麼能阻止過渡?

我試過還原Ember.RSVP.Promise,但似乎willTransition不支持承諾。

所以問題是怎麼可能防止轉移到另一條路線與異步確認?

+1

在一個不相關的音符,你不應該打電話給你的變量「事件」,並加倍如此,如果他們不代表事件。 – Tomalak

+0

在我的情況下,它是一個事件實體,所以它很好 –

回答

7

您可以使用abort取消/暫停轉換,然後使用相同的轉換實例可以呼叫retry再次嘗試轉換。

在包含的示例中,我正在停止轉換,稍後再次啓動它。您可以啓動您的確認對話框,並在點擊確定/取消時使用轉換對象繼續轉換。

willTransition: function(transition){ 
    var self = this; 
    if(!this.get('allowTransition')){ 
    console.log('transition abort'); 
    transition.abort(); 

    Em.run.later(function(){ 
     self.set('allowTransition', true); 
     console.log('transition retry'); 
     transition.retry(); 
    }, 1000); 
} 

http://emberjs.jsbin.com/gefituqo/1/edit

+0

好戲法! (如果沒有更清潔的解決方案,那麼我會使用它。謝謝 –