2016-09-08 2 views
1

これは私のapp.moduleがどのように見えるかです:ブートストラップコンポーネントなしプロバイダ

@NgModule({ 
    imports:[BrowserModule,HttpModule,SharedModule.forRoot(),NavigationBarModule,routing,JsonpModule], 
    declarations: [RootComponent], 
    providers:[PopupManager], 
    bootstrap: [RootComponent] 
}) 
export class AppModule { } 

これは私の共有モジュールがどのように見えるかです:

@NgModule({ 
    imports: [CommonModule], 
    exports: [CommonModule,RouterModule,LoaderComponent], 
    declarations:[LoaderComponent] 
}) 
export class SharedModule { 
    static forRoot(): ModuleWithProviders { 
    return { 
     ngModule: SharedModule, 
     providers: [ AccountValues,PopupManager,Preferences,TimeFormatter,UserDataProvider], 
    }; 
    } 
} 

これは私がPopUpManagerがどのように見えるかです:

@Injectable() 
export class PopupManager{ 
    private activePopUpComp: HasAPopUp; 

    constructor(){ 
     console.log("PopupManager created"); 
    } 
} 

これは私のRootComponentの外観です。

@Component({ 
    selector : 'root', 
    templateUrl : 'Content/Angular2/Development/partials/root.html', 
    styleUrls:['Content/Angular2/Development/css/CommonStyle.css'] 
}) 

export class RootComponent{ 
    constructor(private popUpManager:PopupManager){ 

    } 
    handleClick():void{ 
     this.popUpManager.setActivePopUpComponent(undefined); 
    } 
} 

PopupManagerは共有モジュールによって提供されていますが、何らかの理由でこのコードを実行すると、PopupManagerのプロバイダがありません。 PopupManagerを明示的に指定したとしても、それはまだ機能しません。私はまた、このように私の共有モジュールを作成しようとしました:

まだ同じエラーが発生します。これはバグだと思う。ブートストラップされたコンポーネントには、どのプロバイダも注入できないバグだと思う。つまり、プロバイダを作成する前にRootComponentが作成されているということです。だから、もしバグではないなら、私は間違ってどこへ行くことができますか?

私は角度2のrc6を使用しています。

答えて

1

私は以下に示すように、あなたが)(静的forRoot内/下SharedModuleプロバイダを使うべきだと思います。これがあなたの問題を解決することを願っています。

@NgModule({ 
    imports:  [ CommonModule,.. ], 
    declarations: [LoaderComponent], 
    exports:  [ CommonModule,... ] 
}) 
export class SharedModule { 
    static forRoot(): ModuleWithProviders { 
    return { 
     ngModule: SharedModule, 
     providers: [ ...,PopupManager,...] //<-----declare providers here 
    }; 
    } 
} 
+0

私は既にこれを試しました。共有モジュールの最初のバージョンを参照してください。 – Adit

+0

次に、 'appModule'から' providers'を削除しなければなりません。また、 'RootComponent'で' PopupManager'をインポートするようにしてください。 – micronyks

+0

私の場合、PopupManagerはただ1つのインスタンスしか持たないでしょう。あなたが提案しているのは、複数のインスタンスを持つことになります。まず第一に、app.moduleにプロバイダーを置くべきではありません。ポップアップマネージメントを何とかしてもらうための絶望的な試みでした。共有モジュールをインポートするだけで、PopupManagerを他のコンポーネントに提供するのに役立ちますが、RootComponentは提供しません。 – Adit

関連する問題