1

我创建了一个基于 Nx 的工作区,它有两个 shell 应用程序(app1 和 app2)。将在这两个应用程序中重用这个 CoreModule 库。

在添加 Ngrx 存储根时,我从库中访问环境对象时出现错误,因为环境文件夹存在于 shell 应用程序中。

请让我知道如何将环境对象注入核心模块,以便我可以对模块进行条件加载

!环境。生产?StoreDevtoolsModule.instrument():[]

这是我遇到错误的代码片段,我在注释中包围了该行。

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { StoreModule } from '@ngrx/store';
import { EffectsModule } from '@ngrx/effects';
import {
  APP_FEATURE_KEY,
  initialState as appInitialState,
  appReducer
} from './+state/app.reducer';
import { AppEffects } from './+state/app.effects';
import { NxModule } from '@nrwl/nx';
import { StoreDevtoolsModule } from '@ngrx/store-devtools';
// <error>
import { environment } from '../environments/environment';
// </error>
import { storeFreeze } from 'ngrx-store-freeze';

@NgModule({
  imports: [
    CommonModule,
    NxModule.forRoot(),
    StoreModule.forRoot(
      { app: appReducer },
      {
        initialState: { app: appInitialState },
        metaReducers: !environment.production ? [storeFreeze] : []
      }
    ),
    EffectsModule.forRoot([AppEffects]),
    !environment.production ? StoreDevtoolsModule.instrument() : []
  ]
})
export class CoreModule {
}

更新:

我试过这个选项来注入环境,但我不能在 @NgModule 装饰器中使用 env 。

@NgModule({
  imports: [CommonModule, HttpClientModule]
})
export class CoreModule {

  static forRoot(environment:any):ModuleWithProviders {
    return {
      ngModule :CoreModule,
      providers: [
        {
          provide : 'env',
          useValue: environment
        }
      ] } }}
4

2 回答 2

0

您可以pathtsconfig.json.

{
  "compilerOptions": {
    ...,  
    "baseUrl": ".",
    "paths": {
      ...,
      "@mainApp/*": ["app1/app/*"],
      "@secondApp/*": ["app2/app/*"]
    }
  }
}

建议(替代方法):您可以尝试避免在共享模块中创建根状态。而是在相应的应用程序模块中创建根状态并在共享模块中创建功能状态并导入它们。这样可能会更容易。另外请检查,在共享模块中创建根存储并导入它们会创建一个或两个根存储的实例?

于 2019-06-10T04:37:45.830 回答
0

这是一个常见问题,因为环境文件由 CLI 存储在应用程序级别。解决此问题的一种方法是拥有一个专用于特定应用程序环境的库libs/myapp/data-access-environment。这将包含两件事:

  1. 环境的类型定义 ( MyAppEnv)
  2. 注入令牌 ( MYAPP_ENV_TOKEN)

您可以使用注入令牌为应用程序提供值。例如在你的app.module

provide: [ { provide: MYAPP_ENV_TOKEN, useValue: myEnv }] // import myEnv from environment.ts

然后在您的其他库中,您可以注入令牌并添加输入

constructor(@Inject(MYAPP_ENV_TOKEN) private env: MyAppEnv) {}

通过这种方式,您可以将环境与您的应用程序分离。

于 2019-06-11T01:15:38.963 回答