【问题标题】:Ember.js: How can I prevent transition on dirty model with async confirmation?Ember.js:如何通过异步确认防止脏模型上的转换?
【发布时间】:2014-05-18 16:04:42
【问题描述】:

我有一个很常见的情况:有一个脏模型,如果用户尝试转换到任何其他路线,我想显示确认。

我有这样的东西可以使用window.confirm 确认对话框:

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

但是如果我想使用异步确认(例如bootbox.js确认),我该如何停止转换?

我尝试返回 Ember.RSVP.Promise,但似乎 willTransition 不支持承诺。

所以问题是如何防止通过异步确认转换到另一条路线?

【问题讨论】:

  • 在不相关的说明中,您不应将变量称为“事件”,如果它们不代表事件,则更应如此。
  • 在我的情况下它是一个事件实体,所以没关系

标签: javascript ember.js ember-data


【解决方案1】:

您可以使用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

【讨论】:

  • 好招! (:好吧,如果没有更清洁的解决方案,那么我会使用它。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-02
  • 2021-02-03
  • 2014-07-08
  • 2021-05-07
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
相关资源
最近更新 更多