Ember.js路由-有条件地阻止路由/状态更改



我正试图找出如何阻止或暂停路由更改。对于我的编辑屏幕,如果用户在有未保存的更改时导航离开(后退按钮或其他机制),我希望提示他们确保要离开页面。与window.onbeforeunload非常相似,但通过路由器。

Ember以前版本中的状态图为您提供了一个可以使用的转换对象。似乎在最近的一个月里,情况已经不是这样了。那么,最好的方法是什么呢?


编辑:

上述问题已过时,所列答案已注明日期。Ember现在有了一种原生的处理方式。请参阅文档:http://emberjs.com/guides/routing/preventing-and-retrying-transitions/

您想要做的是使转换成为有条件的。您不需要直接使用Ember.Route.transitionTo,而是需要以下内容:

var transitionAfterConfirmation = function(target){
  var defaultEvent = Ember.Route.transitionTo(target),
      event = function(stateManager, context){
          if( confirm("Really go?")){
              defaultEvent(stateManager,context);
          }
      };
  event.transitionTarget = target;
  return event;
};

参见http://jsfiddle.net/hjdivad/KsHCN/例如。

Ember的路由器现在有了一个本机机制,可以很容易地做到这一点。请参阅文档:http://emberjs.com/guides/routing/preventing-and-retrying-transitions/

我不确定这是否可能,因为在退出状态之前没有可用的处理程序(也许我错过了什么)。从触发enterState和enterState()代码来看,似乎无法中断或取消两种状态之间的转换。

我认为Tom Dale在"允许取消状态转换"中对此进行了解释。

在您的情况下,也许您可以声明一个中间状态,负责在用户取消的情况下重定向到以前的状态,或者在用户接受的情况下转到新状态。我不得不说,写起来容易实现起来难:(

最新更新