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

12
我正在尝试找出如何防止或暂停路由更改。对于我的编辑屏幕,如果用户在有未保存更改时导航离开(后退按钮或其他机制),我想提示他们确保要离开页面。与window.onbeforeunload非常相似,但通过路由器实现。
以前版本的Ember中的状态图表提供了一个可用的转换对象。在最新的Ember版本中,似乎不再是这种情况。那么最佳方法是什么?

编辑:

上述问题已经过时,列出的答案也已过时。Ember现在有一种本地方式来处理这个问题。请参见文档:http://emberjs.com/guides/routing/preventing-and-retrying-transitions/

3个回答

8
你想要做的是让你的转换有条件。不要直接使用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/


非常好!我会保存你的fiddle链接... :-) - Mike Aski

6

2
我不确定是否可能,因为在退出状态之前似乎没有可用的处理程序(也许我错过了什么)。从触发进入状态enterState()代码来看,似乎无法中断或取消两个状态之间的转换。
我认为Tom Dale在允许取消状态转换中解释了这一点。
在您的情况下,也许您可以声明一个中间状态,负责在用户取消时重定向到上一个状态,或者在用户接受时转到新状态。我必须说,写起来比实现起来容易 :)

我同意 Tom Dale 在 GitHub 上的回复。这应该标记为接受的答案。 - dmzza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接