我正在制作一个 Angular 库,其中包含我们所有应用程序都需要的 auth/graphql 相关代码。
问题是,我将uri
存储在 Angular 环境变量中,而 Angular 库中不存在该变量。
执行ng add apollo-angular
将生成以下模块:
graphql.module.ts(为清楚起见,删除了导入(:
const uri = ''; // <-- add the URL of the GraphQL server here
export function createApollo(httpLink: HttpLink) {
return {
link: httpLink.create({uri}),
cache: new InMemoryCache(),
};
}
@NgModule({
exports: [ApolloModule, HttpLinkModule],
providers: [
{
provide: APOLLO_OPTIONS,
useFactory: createApollo,
deps: [HttpLink],
},
],
})
export class GraphQLModule {}
请注意uri
,它创建了对应注入的此模块的依赖关系。
在我的应用程序app.module.ts
中,我创建了一个获取环境的提供程序:
providers: [
{
provide: 'envVars', useValue: environment
}
]
我通常通过构造函数注入,如下所示:
constructor(@Inject('envVars') private envVars: any) {}
我已经尝试了很多方法来注入这种uri
但无济于事!建议?
我在这个StackOverflow帖子中找到了解决问题的方法:
https://stackoverflow.com/a/46791075/1207856
但是,我根据我的独特情况调整了我的。
首先在 AppModule app.module.ts 中,使用forRoot()
静态方法提供环境:
GraphQLModule.forRoot(environment)
其次,在库模块中,可以将该环境设置为类的静态成员,如下所示:
export class GraphQLModule {
public static envVars: any
public static forRoot(environment: any): ModuleWithProviders {
// this is to provide to this module non-class section
this.envVars = environment
// this is provide to children
return {
ngModule: GraphQLModule,
providers: [
{
provide: 'envVars',
useValue: environment
}
]
}
}
}
现在,我可以在这个实际模块本身中静态使用它,或者通过@Inject
在使用此模块的任何子组件或模块中使用它。
所以在这个实际模块中,我可以这样做:
GraphQLModule.envVars.gatewayUri
或者在另一个类的构造函数中,我可以这样做:
constructor(@Inject('envVars') private envVars: any) {}
享受!