【问题标题】:Passing environment files into custom Angular 2 Module将环境文件传递到自定义 Angular 2 模块
【发布时间】:2018-03-09 08:15:12
【问题描述】:

我目前正在制作一个依赖于主机环境的自定义角度库。理想情况下,我只想在我的模块的forRoot 方法中传递几个环境变量,以便服务使用,具体取决于使用它的应用程序以及它们所处的环境。但是在使用 angular- 编译时出现错误cli,然后将变量从我的environment.ts 传入app.module.ts

错误中的错误:静态解析符号值时遇到错误。不支持函数调用。考虑将函数或 lambda 替换为对导出函数的引用(原始 .ts 文件中的位置 19:24),在 /Users/griffin/DCP/customer-dashboard/src/environments/environment.ts 中解析符号环境,解析/Users/griffin/DCP/customer-dashboard/src/app/app.module.ts中的符号AppModule,解析/Users/griffin/DCP/customer-中的符号AppModule

自定义模块的索引当前设置如下:

@NgModule({
 declarations: [],
 exports: [],
 providers: [
 AuthService
],
imports: [
 HttpModule,
 BrowserModule
]
})
export class CommonAuthModule {
 static forRoot(config: AuthServiceConfig): ModuleWithProviders {
  return {
   ngModule: CommonAuthModule,
    providers: [
     {provide: AuthServiceConfig, useValue: config }
    ]
  };
}

在一个 Angular 项目中我是这样导入的:

import { CommonAuthModule } from '@dcp/common-auth';
import { environment } from '../environments/environment';

@NgModule({
 declarations: [
  AppComponent
 ],
 imports: [
  CommonAuthModule.forRoot(environment.authConfig) // Import here
  ...
 })
 export class AppModule { }

environment.authConfig 是一个简单的对象

authConfig: {
  authenticationUrl: 'https://streamworks.auth0.com/login?client=',
  clientId: 'f98h3f3fdsousfoihohfjwe0',
  auth0Domain: 'streamworks.auth0.com'
}

而 AuthServiceConfig 是一个简单的类

export class AuthServiceConfig {
  clientId: string = ''
  auth0Domain: string = '';
  authenticationUrl: string = '';
}

我看到过类似的问题,例如 this 帖子。这与 AoT 编译有关吗?我尝试绕过 AoT 来构建项目,但仍然遇到同样的错误。

【问题讨论】:

    标签: angular typescript angular-ngmodel


    【解决方案1】:

    问题是当你指定'useValue'时,你必须实际指定一个值,而且它必须是没有注入的。

    我有类似的代码工作,但我使用 'useFactory' 代替。 为此,您必须在模块类中提供一个充当工厂的静态方法(返回所提供事物的实例)。

    我的看起来像这样:

    NgModule({
      declarations: [
        AppComponent
      ],
      imports: [
        BrowserModule,
        AppRoutingModule,
        etc....
      ],
      providers: [
        { provide: COMMON_CONFIG, useFactory: AppModule.commonConfigFactory },
    
      ],
      bootstrap: [AppComponent]
    })
    export class AppModule {
      static commonConfigFactory() {
        return new CommonConfig(environment);
      }
    }
    

    在上面的代码中,COMMON_CONFIGInjectionToken"CommonConfig" 是环境对象的简单包装类。

    【讨论】:

    • 绝对在正确的轨道上。但是如何通过 forRoot 方法在我的库中提供 COMMON_CONFIG 作为“useValue”的值?
    猜你喜欢
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 2018-06-14
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    相关资源
    最近更新 更多