我已经实现了Aurelia doc(http://aurelia.io/hub.html#/doc/article/aurelia/router/latest/router-configuration/8)
中的AuthorizeStep示例代码@inject(MdToastService,I18N)
class AuthorizeStep {
constructor(toast:MdToastService,i18n:I18N) {
this.toast = toast;
this.i18n = i18n;
}
run(navigationInstruction, next) {
if (window.sessionStorage.getItem('subject')===null
&& navigationInstruction.config.settings!==undefined
&& navigationInstruction.config.settings.auth!==false) {
this.toast.show(this.i18n.tr('backend:LOGIN_REQUIRED_DESCRIPTION'), 5000, 'error');
return next.cancel(new Redirect('welcome'));
}
return next();
}
}
如果用户访问受限区域" / admin",他将被重定向到" / welcome"。但我想记住引用者" / admin",并在登录后将用户重定向到该区域。
return next.cancel(new Redirect('welcome',{referer:navigationInstruction.fragment}));
实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
我遇到了同样的问题。在我让他们进入之前,我不得不问用户使用条款。使用条款是一条不同的路线,我必须记住用户来自哪里。我用以下代码存档了它。
注入一个可以保存之后所需状态的服务类的技巧。
我写了一个服务类TermsOfUseOptInService来处理用户来自的optin状态和重定向路由。 在路由器管道步骤中,您可以从navigationInstructions参数获取有关当前路由(fragment + queryString)的信息,并将它们设置为注入的服务类。
import { autoinject } from 'aurelia-framework'
import { Redirect, NavigationInstruction, Next } from 'aurelia-router';
import { TermsOfUseOptInService } from '../resources/services/terms-of-use-opt-in-service'
@autoinject()
export class TermsOfUseOptInStep {
constructor(private optInService: TermsOfUseOptInService) {
}
run(navigationInstructions: NavigationInstruction, next: Next): Promise<any>
{
if (navigationInstructions.getAllInstructions().some(i => i.config.settings.thersOfUseOptIn)) {
if (!this.optInService.TermsOfUseAccepted) {
let backUrl = navigationInstructions.fragment;
if (navigationInstructions.queryString) {
backUrl += '?' + navigationInstructions.queryString;
}
this.optInService.backUrl = backUrl;
let redirect = new Redirect(this.optInService.RedirectRoute);
return next.cancel(redirect);
}
}
if (!(navigationInstructions.config.name == this.optInService.RedirectRoute)) {
this.optInService.backUrl = null;
}
return next();
}
}
处理opt in的视图也会注入TermsOfUseOptInService并可以处理反向重定向。
if (this.optInService.backUrl) {
this.router.navigate(this.optInService.backUrl);
}