redirectTo
属性在我的Angular 2应用中不起作用。我的app.routing.ts
中有以下路线:
const routes: Routes = [
{ path: '', redirectTo: '/page/1', pathMatch: 'full' },
{ path: 'page', loadChildren: 'app/modules/page/page.module#PageModule' }
]
export const routing = RouterModule.forRoot(routes);
然后,在我的
page.routing.ts
中,我有以下内容:const pageRoutes: Routes = [
{ path: ':id', component: PageComponent, canActivate: [LoginGuard] }
];
export const pageRouting = RouterModule.forChild(pageRoutes);
每次我访问主页时,它都会显示
LoginComponent
一秒钟,然后它消失。但是,它应该重定向到PageComponent
。为什么不这样呢?如果用户已经登录,为什么要加载
LoginComponent
(即使只是短暂的一秒钟)?这是我的
LoginGuard
:@Injectable()
export class LoginGuard implements CanActivate {
constructor(private af: AngularFire, private router: Router) {}
canActivate(): Observable<boolean> {
return this.af.auth.map(auth => {
if (auth === null) {
this.router.navigate(['/login']);
return false;
} else {
return true;
}
}).first();
}
}
编辑:临时,如果用户登录,我将
LoginComponent
更改为重定向到PageComponent
。但是,我仍然想知道为什么redirectTo
无法正常工作。 最佳答案
我不知道为什么会这样,但是我相信如果在PageModule加载之前检查LoginGuard,它将起作用。
应用程序路由
const routes: Routes = [
{ path: '', redirectTo: '/page/1', pathMatch: 'full' },
{
path: 'page',
// Call the guard before the module is loaded
canLoad: [ LoginGuard ]
loadChildren: 'app/modules/page/page.module#PageModule'
}
]
export const routing = RouterModule.forRoot(routes);
LoginGuard
@Injectable()
export class LoginGuard implements CanActivate, CanLoad {
constructor(private af: AngularFire, private router: Router) {}
// Add this method to validade the canLoad
canLoad(route: Route): Observable<boolean> {
return this.canActivate();
}
canActivate(): Observable<boolean> {
return this.af.auth.map(auth => {
if (auth === null) {
this.router.navigate(['/login']);
return false;
} else {
return true;
}
}).first();
}
}