0

我正在制作一个 Angular 库,其中包含我们所有应用程序都需要的 auth/graphql 相关代码。

问题是,我将uriAngular 环境变量存储在 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无济于事!建议?

4

1 回答 1

0

我在 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) {}

享受!

于 2019-09-12T21:08:25.477 回答