2016-10-14 10 views
4
でNgModuleの設定を変更する方法

そのサービス構成を公開するいくつかのモジュールは、たとえば、ありますランタイム

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

方法実行時にこれらのいずれかを再設定しますか?たとえば、ユーザーが2つのリンクのいずれかを選択し、別のモジュールが遅延ロードされ、別の方法で設定されている場合、どうすればこの新しいNgModuleにデータを渡すことができますか?インジェクタが作成された後

私は考えることができるすべては、グローバルスコープで何かを入れて、そこからそれを読むことですが...右に感じることはありません:)

答えて

2

プロバイダを変更することはできません。

ステータスに応じて異なるインスタンスを提供するサービスを作成できます。

@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(); 
    } 
} 
+0

のようにそれを使用!非常に涼しい、あなたは私の一日を作った:Pはっきりさせるほんのいくつかの事柄: 'これは幼児のインジェクター= ... 'はどこから来たの?そして、 'AngularFireModule.initializeApp(this.firebaseConfig) ''は単に引数* firebaseConfig *でなければなりません。私は再構成したいすべてのサービスのためにこれを書かなければならないでしょう(私は、とにかく多くを持っているとは思わないが)。 – Sasxa

+0

間違いを指摘してくれてありがとう。私はStackOverflowエディタで構文の強調表示が間違っています;-)私はコードを更新しました。 –

+0

これを遅延読み込みモジュールの 'prodivers:[ProviderService]'に入れますか?遅延アンロードモジュール用にこのプロバイダを処分するか?クリーンアップを行う必要がありますか? – Sasxa