Angular特性模块服务注入根服务时出现undefined问题求助
问题分析与解决方案
首先你代码里存在明显笔误:MyModule的providers数组中写的是BetterModalsService,但实际需要提供的是ModalsService,这会导致ModalsService未被该模块正确注册,是引发问题的核心原因之一。
其次是依赖注入的层级冲突:
ApiService通过providedIn: 'root'注册在根注入器,会在应用启动时就完成实例化。ModalsService若仅在特性模块MyModule的注入器中提供,根注入器无法访问子模块注入器内的服务实例。而组件能正常注入,是因为组件的注入器会从自身模块向上递归查找依赖,只要组件所在模块导入了MyModule,就能找到该服务。
解决方案
方案1:将ModalsService改为根级提供(推荐)
修改ModalsService的注册方式,让它属于根注入器,这样ApiService就能正常获取依赖:
@Injectable({ providedIn: 'root' }) export class ModalsService { ... }
同时移除MyModule中providers数组里的相关配置,根级服务会自动注册到应用全局。
方案2:调整ApiService的注册范围到MyModule
如果必须在MyModule中提供ModalsService,可以把ApiService的注册范围改为MyModule,让它归属该模块的注入器,从而能访问模块内的ModalsService:
@Injectable({ providedIn: MyModule }) export class ApiService { constructor(private modalsService: ModalsService) { } ... }
注意:若MyModule是懒加载模块,这种方式会导致ApiService在每个懒加载实例中生成新对象;若为预加载模块,则仍保持单例。
方案3:在根注入器中注册ModalsService
如果不想修改ModalsService的providedIn配置,可在AppModule的providers数组中注册该服务,让根注入器能直接找到它:
@NgModule({ ... providers: [ModalsService], ... }) export class AppModule { }
同时确保MyModule中不再重复提供ModalsService,避免创建多个实例。
先修正MyModule里的笔误(将BetterModalsService改为ModalsService),再根据业务需求选择上述方案之一,即可解决this.modalsService为undefined的问题。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

