Ember.js 从上一个url登录后重新定向
我有一个应用程序,你只有在登录时才能进入。我想做一个重定向后,用户是日志,但只有当他试图从网站访问一个页面 例如: 用户在其电子邮件中收到此链接:Ember.js 从上一个url登录后重新定向,ember.js,Ember.js,我有一个应用程序,你只有在登录时才能进入。我想做一个重定向后,用户是日志,但只有当他试图从网站访问一个页面 例如: 用户在其电子邮件中收到此链接: http://mywebsite.com/#/enquiry/1 当他点击它时,它将被重定向到登录表单上,因为他没有登录。但在登录正常后,他会自动重定向到最后一个链接 我已经从任何地方重定向到登录表单,如果他不是日志,但我不知道如何保存URL并再次返回 我像这样使用重定向: App.MyRoute = Ember.Route.extend({
http://mywebsite.com/#/enquiry/1
当他点击它时,它将被重定向到登录表单上,因为他没有登录。但在登录正常后,他会自动重定向到最后一个链接
我已经从任何地方重定向到登录表单,如果他不是日志,但我不知道如何保存URL并再次返回
我像这样使用重定向:
App.MyRoute = Ember.Route.extend({
redirect: function() {
if ( not log in ) {
// TransitionToLogin
}
}
});
有人知道我如何做到这一点吗
谢谢大家! 如果您熟悉余烬和路由,请快速解释:
您可以通过使用路由上的beforeModel(transition){…}
hook来查看您是否登录。如果未登录,请将转换变量隐藏在某个位置,暂时转换到登录路径,然后在成功验证后,。重试()
存储的上一个转换
确保这是防弹的,因为您的身份验证代码在您的站点上是相当“全局”的。处理用户直接登录的情况,因此登录路径没有可用的隐藏转换。还可以处理一些奇怪的情况,比如他们进入登录页面两次,在调用.retry()
之前先清理临时存储以进行转换
另一种选择是使用Tori:
如果您不想自己构建此代码,并且必须在所有受保护的路由上复制此代码,那么已经有了对此的支持,使用。一旦设置了会话和提供程序,只需使用this.authenticatedRoute('my-protected-route')代码>路由映射函数,而不是普通的this.route('my-route')代码>您已经使用过的
Tori文档有点难理解,但是一旦你理解了它们,这个库对于使用多种身份验证机制快速启动和运行非常有用。例如,开始同时支持电子邮件/密码和Facebook登录是非常简单的。我建议你去看看
非曲面代码示例:
如果您只想使用vanilla Ember,并自己实现它,我会为您的示例提供一个代码示例,但正如ppcano在注释中提到的那样。以下是文档中相应的文本。它涵盖了我在快速解释中提到的所有内容
存储和重试转换
中止的转换可以稍后重试。这方面的一个常见用例是使用经过身份验证的路由将用户重定向到登录页面,然后在用户登录后将其重定向回经过身份验证的路由
如果您正在使用,请看一看,它会在转换到目标路由之前强制进行身份验证
它还负责在身份验证后重定向到上一个URL
如果您正在使用此mixin并覆盖sessionAuthenticated(),那么请确保您有this.\u super(…参数)代码>在sessionAuthenticated()中,以保留重定向逻辑。此特定案例记录在《余烬指南》(存储和重试转换)中。非常感谢您的帮助,它正在工作,但我有一个问题。url是/enquiry/undefined
而不是/enquiry/1
,我不知道如何解决这个问题。。。这是关于如何使用动态段设置路由定义并实现route.model方法的另一个问题。如果你需要帮助,试着复制你的案例,这样其他人可以更容易地帮助你。
// app/routes/some-authenticated.js
export default Ember.Route.extend({
beforeModel(transition) {
if (!this.controllerFor('auth').get('userIsLoggedIn')) {
var loginController = this.controllerFor('login');
loginController.set('previousTransition', transition);
this.transitionTo('login');
}
}
});
// app/controllers/login.js
export default Ember.Controller.extend({
actions: {
login() {
// Log the user in, then reattempt previous transition if it exists.
var previousTransition = this.get('previousTransition');
if (previousTransition) {
this.set('previousTransition', null);
previousTransition.retry();
} else {
// Default back to homepage
this.transitionToRoute('index');
}
}
}
});