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

时间:2012-07-23 17:47:01

标签: ember.js ember-old-router

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

以前版本的Ember中的状态图为您提供了一个可以使用的过渡对象。似乎在ember-latest中,情况已不再如此。那么最好的方法是什么呢?


修改

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

3 个答案:

答案 0 :(得分: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/以获取示例。

答案 1 :(得分:6)

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

答案 2 :(得分:2)

我不确定这是可能的,因为在退出州之前(或许我遗漏了一些东西)没有可用的处理程序。 查看triggering enter stateenterState() code,看起来您无法中断或取消两个州之间的转换。

我认为Tom Dale在Allow canceling state transitions中解释了这一点。

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