我有一个config.json文件,其中包含我的angular 7应用程序的环境变量,然后将其加载到环境const中,并且工作正常。 一旦我尝试使用InjectionTokens将此环境变量传递给我的新库,就会开始发生奇怪的行为。 我不仅想知道如何解决它,还想知道怎么办。
我已经尝试了多种方法来导入json文件,包括使用XMLHttpRequest。 在将对象设置为环境之前,还尝试过深度复制对象。
我的config.json文件:
{
"baseHref": "app",
"apiEndpoint": "http://localhost:8080/api"
}
我的environment.prod.ts文件:
import config from '../config.json';
export const environment = {
production: true,
baseHref: config.baseHref,
apiEndpoint: config.apiEndpoint,
testing: 'Testing'
};
console.log(environment);
我的app.module.ts文件:
imports: [
TestingModule.forRoot({
baseHref: environment.baseHref,
apiEndpoint: environment.apiEndpoint,
testing: environment.testing,
production: environment.production
}),
]
我的app.module.ts文件:
export class TestingModule {
static forRoot(config: any): ModuleWithProviders {
return {
ngModule: TestingModule,
providers: [
{
provide: TESTING_CONFIG,
useValue: config,
},
],
};
}
}
我的testing.service.ts构造函数:
constructor(@Inject(TESTING_CONFIG) private config: any) {
console.log(this.config);
}
期望两个控制台日志中的所有变量都带有数据,但是,环境文件一个拥有所有数据,但是第二个控制台日志中将apiEndpoint显示为null,将测试显示为“ Testing”。
我还尝试调试该应用程序,并在forRoot之前已经将所有数据包含在环境属性中。
也注意到了,用以下命令运行它:
"aot": true,
"buildOptimizer": true
在没有这两个选项的情况下运行时确实存在此问题。
答案 0 :(得分:0)
我找到的解决方案来自于: Angular call function inside forRoot method
我知道传递一个回调来解析环境中的环境变量:
export function getConfig() {
return {
baseHref: environment.baseHref,
apiEndpoint: environment.apiEndpoint,
testing: environment.testing,
production: environment.production
};
}
imports: [
TestingModule.forRoot(getConfig),
]
然后在库中,我经过一个工厂,该工厂执行给出的任何回调。
export function initializeConfigs(configCallback: any) {
return configCallback();
}
export class TestingModule {
static forRoot(config: any): ModuleWithProviders {
return {
ngModule: TestingModule,
providers: [
{
provide: 'CONFIG_CALLBACK',
useValue: config,
}, {
provide: TESTING_CONFIG,
useFactory: initializeConfigs,
deps: [ 'CONFIG_CALLBACK' ]
}
],
};
}
}
这将使TESTING_CONFIG注入令牌正确包含所有数据,而无需更改环境文件。