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/