2016-10-19 8 views
3

私のアプリケーションはSPAではありませんが、私はページの一部にAngular 2を使用しています。どこかのページの下部にプロバイダごとに異なる複数のルートモジュールをブートストラップ(外部から提供)

let serviceOne = new ServiceOne("SuperImportantInfoFromSomewhere"); 
let providers: any = [{ provide: ServiceOne, useValue: serviceOne }]; 
platformBrowserDynamic(MyFirstRootModule, providers); 

ルートモジュール2、::

ルートモジュール1:

私は外の世界からの情報が含まれている注射用プロバイダとブートストラップ複数のルートモジュールを作成しました
let serviceTwo = new ServiceTwo(42); 
let providers: any = [{ provide: ServiceTwo, useValue: serviceTwo }]; 
platformBrowserDynamic(MySecondRootModule, providers); 

悲しいことに、これはうまくいきません。私がServiceTwoをコンポーネントに注入させたいとき、それは失敗します。これは、最初のブートストラップ(この場合はMyFirstRootModule)で両方のサービスを提供する場合にのみ機能します。私は完全に理解していない新しいDIシステムに関連するものでなければなりません。

私はCMS内で働いているため、最初のブートストラップではすべてのプロバイダがわかりません。 2つのモジュールは互いに知りません。

最初のルートモジュールがブートストラップされた後、これらの2つのモジュールを完全に分離する方法や、何らかの形でDIシステムに2番目のサービスを提供する方法はありますか?

+0

重要なのは、両方のブートストラップコンポーネントです。結局、Angular 2の良いユースケースのようには見えません。 – estus

+0

あなたは正しいです、彼らは2.0への途中でいくつかのユースケースを残しました。悲しい。 –

+0

あなたのアプローチに代わるより良い方法があるかもしれません。 2番目のモジュールのルートコンポーネントが最初のコンポーネントのルートコンポーネントの子コンポーネントである場合、これが実際の問題です。詳しくは、[MCVE](http://stackoverflow.com/help/mcve)を参考にしてください。 – estus

答えて

0

私は非常に汚い回避策を考え出しました。モジュールをブートストラップする前に、私は反映APIを使用して、クラスの注釈に直接プロバイダを追加:

import "reflect-metadata"; 
import { MySecondRootModule } from "MySecondRootModule"; 
import { ServiceTwo } from "ServiceTwo"; 

export class MySecondRootApplication 
{ 
    constructor() 
    { 
     let serviceTwo = new ServiceTwo(42); 
     let annotations: Array<any> = (Reflect as any).getMetadata("annotations", MySecondRootModule);  

     if (annotations[0].providers != undefined) 
     { 
      annotations[0].providers.push({ provide: ServiceTwo, useValue: serviceTwo }); 
     } 
     else 
     { 
      annotations[0].providers = [{ provide: ServiceTwo, useValue: serviceTwo }]; 
     } 

     (Reflect as any).defineMetadata("annotations", annotations, type); 

     // Perform what ever else needs to be done 

     platformBrowserDynamic(MySecondRootModule); 
    } 
} 

は、私が知っている、それは悪いです。しかし、それは動作します。ところで、このメソッドを使用すると、たとえばASP.NET MVCの部分ビューの結果を使用する場合など、templateUrlを変更することもできます。

関連する問題