4

我正在尝试迁移到 Ember 中的新路由器。用例是这样的:用户未登录,但请求需要登录的 URL。他被重定向到登录路径,成功登录后,他被重定向到原来的目的地。

我通过覆盖 Router.route(path) 并在应用程序处于未经授权状态时拦截路径请求,使用先前的路由器实现了这一点。

新的路由器没有 route() 函数,而且我不知道如何覆盖它,因为路由器实例是由 Ember 自动创建的。我可能不应该那样做。

有一个看起来很有用的 Route.redirect() 钩子。但是,Route 不再扩展 v2 Router 中的 Path,因此没有 Root.path,也没有将路径信息传递给 Route.redirect(),所以我不知道如何保存调用 transitionTo() 的路径信息之后。

我在下面提供了我的一般方法。我怎样才能做到这一点?对于许多应用程序来说,这似乎是一个非常常见的用例。

  // i imagine something like this should happen
  App.AuthRequiredRoute = Ember.Route.extend({
       redirect: function() {
            if(!App.controllerFor('login').get('isLoggedIn')) {
                  var pathToSave = ????
                  App.controllerFor('login').set('pathAfterLogin',pathToSave);
                  this.transitionTo('login');
             }
        }
   }
   // and then after login, the LoginController would call App.router.transitionTo(this.pathAfterLogin)
4

1 回答 1

0

在过去的一两天里,我自己对此做了很多研究。我可以与您分享我的发现和一些想法。

首先,您可以获得一些有关当前路径和上下文的信息,如下所示:

this.router.router.currentHandlerInfos

这将返回一个数组。每个对象都有一个名称和一个上下文属性。这些名称对应于您将在 transitionTo 中调用的路由器的名称。

在我看来,虽然你可以使用这样的东西,但它会很混乱。API 文档没有提到这一点,并且可能无意将其用作公共 API。

对于更深的嵌套动态段,我也看到了上述解决方案的问题。鉴于路由器 v2 有多新,我认为它将继续发展,并且可能会出现更好的解决方案。想要保存当前位置并在以后返回它是一件相当普遍的事情。

同时,如果未在 ApplicationController 上设置身份验证标志,则可能在模板中使用条件块而不是重定向,以呈现登录而不是出口?我知道这不是“正确的”,而是“现在”。

于 2013-01-08T23:05:48.940 回答