Angular 2路由警卫CanActivateChild与延迟加载模块路由

Angular 2路由警卫CanActivateChild与延迟加载模块路由

问题描述:

我有一个主要路由有儿童路由和这些孩子是懒惰加载模块,并在每个懒惰加载模块,我也有他们单独的路由。我遇到的问题是,当我守护的主要途径,以防止装载的孩子将其路由调用多个时间Angular 2路由警卫CanActivateChild与延迟加载模块路由

主路由代码

export const PROVIDER_ROUTES: Route = { 
    path: 'provider', 
    component: ProviderComponent, 
    canActivateChild:[AuthGuard], 
    children: [ 
     { path: '', redirectTo: 'courses', pathMatch: 'full' }, 
     { path: 'courses', loadChildren: 'app/provider/course/course.module#CourseModule' }, 

    ], 

}; 

延迟加载路由代码

const routes: Routes = [ 
    { 
    path: '', 
    component: CourseListComponent, 
    resolve: { courses: CourseListResolver }, 
    children: [ 
     { 
     path: ':id', 
     component: CoursesEditComponent, 
     resolve: { organizations: AddCourseResolver } 
     }, 
     { 
     path: ':id/edit', 
     component: CoursesEditComponent, 
     resolve: { course: CourseEditResolver } 
     }, 
     { 
     path: ':id/assign/:orgId', 
     component: CourseAssignComponent, 
     resolve: { subOrganizations: LicenseAssignResolver } 
     }, 
     { 
     path: ':id/update/:orgId', 
     component: CourseAssignComponent, 
     resolve: { license: LicenseEditResolver } 
     } 

    ] 
    }, 
]; 

@NgModule({ 
    imports: [RouterModule.forChild(routes)], 
    providers: [ 
    CourseListResolver, 
    CourseEditResolver, 
    LicenseAssignResolver, 
    LicenseEditResolver, 
    AddCourseResolver 
    ], 
    exports: [RouterModule], 
}) 
export class CourseRoutingModule { } 

export const RoutedComponents = [ 
    CourseListComponent, 
    CoursesEditComponent, 
    CourseAssignComponent 
]; 

AuthGuard代码

export class AuthGuard implements CanActivateChild { 

    constructor(private authService: AuthService, private router: Router, private commonService:CommonService) { } 
    canActivateChild(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> { 
    return this.authService.isUserLoggedIn().map((result: EditUser) => { 
     console.log(result); 
     if (result != null && result.organizations.length > 0) { 
     this.commonService.isAuthenticated = true; 
     return true; 
     } 
     this.commonService.isAuthenticated = false; 
     this.router.navigate(["/provider"]) 
     return false; 
    }); 

多次调用AuthGuard函数为什么?

enter image description here

你有2级激活途径,因此它会检查每个级别的后卫。如果你想打电话一次,只需把防护装置移动到儿童的位置。