Angular Guard 在延迟加载功能模块中的影响,提供的服务:'root'
Affect of Angular Guard within lazy loaded feature module with service providedIn: 'root'
好吧,假设我有 AppRoutingModule
声明带有延迟加载模块的路由,然后我需要至少一个路由来使用守卫,例如 CanDeactivate
。这个守卫被放置在其中一个功能模块中,它使用服务进行验证,它在同一个模块中。
所以当我运行代码的时候,我明明得到了nullInjectorError: R3InjectorError(AppModule)[guard-> service-> service-> service]
,所以我决定在那个服务中的@Injectable
中使用providedIn: 'root'
,这解决了我的问题,但我不确定这是否会以某种方式影响延迟加载?
所以问题是:
providedIn: 'root'
是否影响延迟加载。它会保持“惰性”加载还是立即加载?
编辑:
AppRouting 中的路由如下所示:
{
path: PATHS.appointmentsCall,
canDeactivate: [InterruptGuard],
loadChildren: () => import('some path').then((m) => m.CallModule),
},
CallModule 中的 Guard 如下所示:
@Injectable({
providedIn: 'root',
})
export class InterruptGuard implements CanDeactivate<unknown> {
constructor(private readonly facade: CallFacade) {}
...
}
CallFacade 就像:
@Injectable({
providedIn: 'root',
})
export class CallFacade {
...
}
所有预先加载的模块共享它们的 RootInjector
(简单来说 AppModule
)。当您使用 @Injectable
注释和 providedIn: 'root'
提供服务时,就像您将它添加到 AppModule
providers
数组一样。该服务的一个实例将在整个应用程序中可用。
将 @Injectable({ providedIn: 'root' })
添加到您的服务中不会弄乱您的延迟加载模块。如果该服务仅在延迟加载的模块中使用,它将与该模块一起延迟加载,否则将在引导应用程序时立即提供。该服务在 RootInjector
.
中提供
在这种情况下,它不会抛出 NullInjector 错误是合乎逻辑的,这是 Angular 尝试解析依赖项并最终抛出错误的最后一站。
其他信息:当您使用 @Injectable({ providedIn: 'root' })
服务时,服务是 tree shakeable 的,这是一般的最佳实践,因为它减少了应用程序的包大小。
每个 https://juristr.com/blog/2021/04/angular-di-and-lazy-modules/
好吧,假设我有 AppRoutingModule
声明带有延迟加载模块的路由,然后我需要至少一个路由来使用守卫,例如 CanDeactivate
。这个守卫被放置在其中一个功能模块中,它使用服务进行验证,它在同一个模块中。
所以当我运行代码的时候,我明明得到了nullInjectorError: R3InjectorError(AppModule)[guard-> service-> service-> service]
,所以我决定在那个服务中的@Injectable
中使用providedIn: 'root'
,这解决了我的问题,但我不确定这是否会以某种方式影响延迟加载?
所以问题是:
providedIn: 'root'
是否影响延迟加载。它会保持“惰性”加载还是立即加载?
编辑:
AppRouting 中的路由如下所示:
{
path: PATHS.appointmentsCall,
canDeactivate: [InterruptGuard],
loadChildren: () => import('some path').then((m) => m.CallModule),
},
CallModule 中的 Guard 如下所示:
@Injectable({
providedIn: 'root',
})
export class InterruptGuard implements CanDeactivate<unknown> {
constructor(private readonly facade: CallFacade) {}
...
}
CallFacade 就像:
@Injectable({
providedIn: 'root',
})
export class CallFacade {
...
}
所有预先加载的模块共享它们的 RootInjector
(简单来说 AppModule
)。当您使用 @Injectable
注释和 providedIn: 'root'
提供服务时,就像您将它添加到 AppModule
providers
数组一样。该服务的一个实例将在整个应用程序中可用。
将 @Injectable({ providedIn: 'root' })
添加到您的服务中不会弄乱您的延迟加载模块。如果该服务仅在延迟加载的模块中使用,它将与该模块一起延迟加载,否则将在引导应用程序时立即提供。该服务在 RootInjector
.
在这种情况下,它不会抛出 NullInjector 错误是合乎逻辑的,这是 Angular 尝试解析依赖项并最终抛出错误的最后一站。
其他信息:当您使用 @Injectable({ providedIn: 'root' })
服务时,服务是 tree shakeable 的,这是一般的最佳实践,因为它减少了应用程序的包大小。
每个 https://juristr.com/blog/2021/04/angular-di-and-lazy-modules/