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();
  }

}

09-28 11:02