APP_INITIALIZER加载的环境属性如何在模型等所有类中访问?
普通模型类不属于Angular的依赖注入(DI)体系的管理范围,所以无法像组件、服务那样通过构造函数注入的方式获取ConfigService实例,进而读取配置。以下是三种常用的解决方案:
方案1:实例化模型时传递配置参数(推荐优先使用)
这是最解耦、最易测试的方案,你在组件/服务中实例化department.model.ts的类实例时,直接把已经拿到的配置作为参数传给构造函数即可。
示例代码:
// department.model.ts 改造 export class Department { private propsConfiguration: PropsConfiguration; // 构造函数新增配置参数 constructor(config: PropsConfiguration, 其他原有参数...) { this.propsConfiguration = config; // 其他原有逻辑 } // 类内方法可以直接访问配置 someMethod() { const urlAdd = this.propsConfiguration.propertyName; // 后续逻辑 } }
在组件/服务中实例化的用法:
// 组件或服务中已经拿到了config的前提下 const dept = new Department(this.propsConfiguration, 其他参数...);
方案2:ConfigService新增静态属性挂载配置
如果不想每次实例化都传参,可以在你的ConfigService里新增静态属性,配置加载完成后直接赋值给静态属性,普通类直接导入ConfigService读取静态属性即可。
示例代码:
// config.service.ts 改造 export class ConfigService { // 新增静态属性存储配置 static globalConfig: PropsConfiguration; private config: PropsConfiguration; getConfiguration() { return this.config; } // 配置加载完成的逻辑里(比如APP_INITIALIZER的加载方法末尾)给静态属性赋值 loadConfig() { // 原有加载JSON配置的逻辑 return http.get('assets/config.json').pipe(tap(config => { this.config = config; // 给静态属性赋值 ConfigService.globalConfig = config; })) } }
模型类中使用:
// department.model.ts import { ConfigService } from 'xxx/config.service'; export class Department { someMethod() { const urlAdd = ConfigService.globalConfig.propertyName; } }
方案3:通过全局Injector手动获取ConfigService实例
你可以把Angular根注入器暴露为全局变量,普通类中直接用注入器获取ConfigService实例即可。
示例代码:
// app.module.ts 改造 export class AppModule { // 静态属性存储根注入器 static injector: Injector; constructor(injector: Injector) { AppModule.injector = injector; } }
模型类中使用:
// department.model.ts import { AppModule } from 'xxx/app.module'; import { ConfigService } from 'xxx/config.service'; export class Department { private configService: ConfigService; constructor() { // 手动获取ConfigService实例 this.configService = AppModule.injector.get(ConfigService); } someMethod() { const config = this.configService.getConfiguration(); const urlAdd = config.propertyName; } }
注意:方案2、3都需要确保配置已经通过
APP_INITIALIZER加载完成后再实例化模型类,由于APP_INITIALIZER会阻塞应用启动,正常业务场景下实例化模型类时配置已经加载完成,不会出现空值问题。
内容的提问来源于stack exchange,提问作者k.vincent
相关产品推荐
相关产品推荐

