angular - 如何在运行时更改 NgModule 配置

标签 angular angular2-services

有一些模块暴露了他们的服务配置,例如:

  • AngularFireModule.initializeApp(firebaseConfig),
  • StoreModule.provideStore(reducer),
  • RouterModule.forRoot(routes)...

我如何在运行时重新配置其中之一?例如,用户选择两个链接之一,不同的模块被延迟加载和配置不同......我如何将数据传递给这个新的 NgModule?

我所能想到的就是将一些东西放在全局范围内并从那里读取它,但是......感觉不对:)

最佳答案

注入(inject)器创建后无法修改提供者。

您可以创建一个服务,根据状态提供不同的实例。

@Injectable()
class ProviderService {
  constructor(injector:Injector) {}

  set firebaseConfig(firebaseConfig) {
    let resolvedProviders = ReflectiveInjector.resolve([AngularFireModule.initializeApp(firebaseConfig)]);
    this.childInjector = ReflectiveInjector.fromResolvedProviders(resolvedProviders, this.injector);    
  }

  get firebase ():AngularFireModule {
    return this.childInjector.get(AngularFireModule);
  }
}

然后像这样使用它

class MyComponentOrService {
  constructor(provider:ProviderService) {}

  changeFirebase() {
    this.provider.firebaseConfig = ...;
    this.fb = this.provider.firebase;
  }

  doSomething() {
    this.fb.xxx();
  }
}

关于angular - 如何在运行时更改 NgModule 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40032954/

相关文章:

angular - 可注入(inject)服务中的引导组件

typescript - 具有基本安全授权的 Angular 2 调用 API

javascript - ng2-dragula 的 dragulaModel 不起作用

javascript - 在自定义服务中通过 Promise Angular 获取值(value)

javascript - 这行在 Angular 语法中是什么?

javascript - 如何检测 cordova iOS WebView 导航事件

angular - 意外值 ToasterModule 请添加 @NgModule 注释

javascript - Angular 服务中的 EventEmitter 是好是坏?

angular - 以 Angular 显示单个元素下的详细信息

typescript - 为什么 http.post 没有在 Angular 2 中调用我的 Controller