Angular导入自定义模块报Cannot access before initialization如何解决
解决方案
你可以按照以下步骤排查修改:
- 调整模块导入逻辑避免交叉引用
由于FeatureMap本身没有导入AppSharedModule,但又被导入到AppSharedModule中,两个模块同时导入ExternalGoogleModule会引发编译时序异常。如果业务上允许FeatureMap依赖AppSharedModule,直接删除FeatureMap的imports数组中的ExternalGoogleModule,改为在FeatureMap中导入AppSharedModule即可;如果需要FeatureMap独立可用,就把FeatureMap从AppSharedModule的导入列表中移除,避免模块交叉引用。 - 检查
ExternalGoogleModule的导入顺序
确认ExternalGoogleModule文件中,AddressAutocompleterComponent的导入语句位于@NgModule装饰器声明之前,避免变量未初始化就被引用的问题,正确顺序参考如下:
// 优先导入组件和依赖 import { AddressAutocompleterComponent } from './address-autocompleter.component'; import { InjectionToken, NgModule, ModuleWithProviders } from '@angular/core'; // 其余第三方、自定义依赖导入... // 再声明Token和模块 export const GOOGLE_TOKEN = new InjectionToken<InjectionConfig>('ExternalChannelIoModule'); @NgModule({ imports: [CommonModule, NgbDropdownModule, NgbTooltipModule, SharedPipesModule], declarations: [AddressAutocompleterComponent], exports: [AddressAutocompleterComponent], }) export class ExternalGoogleModule { static forRoot(config: InjectionConfig): ModuleWithProviders<ExternalGoogleModule> { return { ngModule: ExternalGoogleModule, providers: [ GooglePlacesService, { provide: GOOGLE_TOKEN, useValue: config, }, ], }; } }
- 确认全局仅注册一次forRoot配置
保证只有根模块AppModule调用了ExternalGoogleModule.forRoot(),其他所有子模块、共享模块都只导入普通的ExternalGoogleModule,避免重复注册provider引发的加载异常。 - 可选:拆分组件到独立模块
把AddressAutocompleterComponent单独抽离为独立的小组件模块,在该模块中完成组件的声明和导出,再让ExternalGoogleModule导入这个组件模块后二次导出,彻底隔离组件加载和模块配置的时序。
如果以上修改后还有问题,可以检查AddressAutocompleterComponent内部的依赖注入项,是否存在未正确初始化的内容。
内容的提问来源于stack exchange,提问作者Crocsx
相关产品推荐
相关产品推荐

