Angular 2+条件通配符重定向

时间:2019-03-08 12:19:01

标签: angular

我有不同的路线,每个路线代表向导中的一个步骤。

const routes: Routes = [
  {
    path: ':id',
    component: ParentComponent,
    children: [
      {path: 'step1', component: Step1Component},
      {path: 'step2', component: Step2Component},
      {path: 'step3', component: Step3Component},
      {path: 'step4', component: Step4Component},
      {path: '**', redirectTo: '???'}
    ]
  }
];

现在,我想要一个条件redirectTo,这样当用户进入第3步并访问根URL时,他将被重定向到第3步。

我要在重定向上执行的逻辑示例:

if(this.stepService.getCurrentStep(id) === 3) {
  return 'step3';
} else {
  return 'step1';
}

如何,所有路由仍应可访问,这样,当用户转到/ step2或/ step4时,他不会被重定向到步骤3。 我认为canActivate守护程序因此不适用。

我当时正在考虑创建一个额外的组件来处理重定向,但似乎也有点

1 个答案:

答案 0 :(得分:0)

我想出了解决方法。

您可以在通配符路由上添加canActivate防护:

const routes: Routes = [
  {
    path: ':id',
    component: ParentComponent,
    children: [
      {path: 'step1', component: Step1Component},
      ...
      {path: '**', canActivate:[RedirectGuard]}
    ]
  }
];

然后在后卫中,您应该返回UrlTree而不是布尔值:

@Injectable({
  providedIn: 'root'
})
export class RedirectGuard implements CanActivate {

  constructor(private stepService: StepService) {}

   canActivate(
     next: ActivatedRouteSnapshot,
     state: RouterStateSnapshot): Observable<UrlTree> {
     const id = next.parent.params.id;
     // Some logic  
     return of(this.router.parseUrl(state.url + '/rejection'));
  }
}

请注意,此解决方案要求角度为7.1 +

信用额转到该博客文章:https://juristr.com/blog/2018/11/better-route-guard-redirects/