我正在尝试迁移到Ember中的新路由器。用例是这样的:用户未登录但请求登录的URL。他被重定向到登录路线,成功登录后,他被重定向到原来的目的地。
我通过覆盖Router.route(路径)并在应用程序处于未授权状态时拦截路径请求来实现之前的路由器。
新路由器没有route()函数,我也不知道如何覆盖它,因为Ember会自动创建路由器实例。无论如何,我可能不应该这样做。
有一个看起来很有用的Route.redirect()钩子。但是,Route不再扩展v2路由器中的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)
答案 0 :(得分:0)
在过去的一两天里,我自己做了很多研究。我可以和你分享我发现的东西,以及一些想法。
首先,您可以获得有关当前路径和上下文的一些信息,如下所示:
this.router.router.currentHandlerInfos
这将返回一个数组。每个对象都有名称和上下文属性。这些名称对应于您在transitionTo中调用的路由器的名称。
在我看来,虽然你可以使用这样的东西,但它会很混乱。 API文档未引用此内容,并且可能无意将其用作公共API。
我也看到了针对更深层嵌套动态段的上述解决方案的问题。鉴于路由器v2有多新,我认为它将继续发展,并且可能会出现更好的解决方案。想要保存当前位置并在以后返回它是相当普遍的事情。
与此同时,如果在ApplicationController上没有设置经过身份验证的标志,那么在模板中使用条件块而不是重定向可能会使用条件块来呈现登录而不是出口?我知道它不是“正确的”,但它“现在”。