角环境循环依赖项

时间:2019-01-23 11:19:18

标签: angular

如文档所述,我使用多个environment文件对应用程序启动进行参数化。

environment.prod.ts

export const environment = {
    production: true,
    module: ProductionModule,
    baseUrl: ...
}

environment.ts

export const environment = {
    production: false,
    module: DevelopmentModule
}

ProductionModule内部,我想从environment模块中“获取”远程API URL。

@NgModule({
    declarations: [],
    imports: [
        LoggerModule.forRoot({ level: NgxLoggerLevel.ERROR })
    ],
    providers: [
        ...
        { provide: API_BASE_URL, useValue: environment.baseUrl }
    ]
})
export class ProductionModule {}

但是这会产生Circular dependency错误。
解决这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

您无需使用providers或模块就可以从environment获取任何信息。

只需在代码中实际需要的地方导入environment.baseUrl

import { environment } from '../../environments/environment';

只需代码

environment.baseUrl

这将使您免于循环依赖(在您的情况下,这不是普遍的意思),看到环境文件中的任何模块对我来说都是一种代码味道。

答案 1 :(得分:0)

这是您的代码中发生的情况(=>表示依赖):

environment.ts/environment.prod.ts =>
DevelopmentModule/ProductionModule =>
environment.ts/environment.prod.ts (because, in providers array, you are using environments

因此,正如您在上面看到的那样,它是如何产生循环依赖的。

正确的方法取决于您,您要如何实现。

一种方法是,如果您不在任何地方使用module,请从environments中删除var acc = document.getElementsByClassName("accordion"); var i; for (i = 0; i < acc.length; i++) { acc[i].addEventListener("click", function() { this.classList.toggle("active"); var panel = this.nextElementSibling; if (panel.style.display === "block") { panel.style.display = "none"; } else { panel.style.display = "block"; } }); }条目。

答案 2 :(得分:0)

在该服务导入环境中使用ApiProvider服务。创建您的项目中与后端API相关的功能。并在项目中的任何地方使用此ApiProvider服务。