是的,Angular的CanLoad守卫只在第一次惰性加载时触发一次。
以下是一个包含代码示例的解决方法:
首先,我们需要在我们的路由配置中定义CanLoad守卫。例如,我们有一个惰性加载的模块名为LazyModule,并且我们希望在加载此模块之前进行一些检查。
const routes: Routes = [
{ path: 'lazy', canLoad: [AuthGuard], loadChildren: () => import('./lazy.module').then(m => m.LazyModule) }
];
接下来,我们需要创建一个AuthGuard来实现CanLoad守卫。
@Injectable()
export class AuthGuard implements CanLoad {
canLoad(route: Route, segments: UrlSegment[]): Observable | Promise | boolean {
if (localStorage.getItem('token')) {
return true;
} else {
// 在这里处理未登录的逻辑,比如跳转到登录页
return false;
}
}
}
在上面的代码中,我们检查localStorage中是否存在token。如果存在,我们允许加载模块;如果不存在,我们阻止加载并执行相应的逻辑,比如跳转到登录页。
最后,将AuthGuard添加到NgModule的providers中。
@NgModule({
...
providers: [AuthGuard],
...
})
export class AppModule { }
现在,当我们第一次访问"/lazy"时,CanLoad守卫将会触发。如果条件满足,模块将会被加载。如果不满足条件,模块将不会被加载。之后的访问将不会再次触发CanLoad守卫。