0

私はng-book 2の1つの例を実行しようとしていて、DIの章で問題に遭遇しました。角2依存性注入:すべてのパラメータを解決できません(デップチェーンなし、バレルなし)

@Component({ 
    selector: 'app-root', 
    template: ` 
     <button (click)="invokeService()">Get Value</button> 
    ` 
}) 
export class AppComponent { 
    constructor(public myService: MyService) {} 

    invokeService() { 
     console.log(this.myService.getValue()); 
    } 
} 
@Injectable() 
export class MyService { 
    getValue(): string { 
     return 'a value'; 
    } 
} 
@NgModule({ 
    declarations: [ 
    AppComponent 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule 
    ], 
    providers: [MyService], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 

はここに手動でReflectiveInjectorを作成するとき、それは完全に動作しますplunker https://plnkr.co/edit/KSXE9tnRj4tffiISyp0iだが、私は簡単な方法を取ると、それは私を与える失敗NgModule上のプロバイダでそれを宣言しようとすると、「AppComponentのすべての依存関係を解決できません。 "私は他の答えをチェックし、円形のデープやバレル関連の問題はないことがわかります。それはすべて1つのファイルにあります。どんなヒントもありがとう!

+0

MyServiceでは、同じモジュール内にある場合、私はそれは別々のモジュールである場合、それが輸入品である必要があり、同様の宣言の中で宣言されるべきだと思いますアレイ、それを試してみましたか? – MikeDub

+0

プランナー内のNgModule宣言配列にMyServiceを追加しようとしましたが、次のエラーが発生しました:(SystemJS)Error:モジュール 'AppModule'によって宣言された予期しない値 'MyService' – user2072027

+0

スクラップは申し訳ありません。ただし、セレクタ/テンプレートの下のAppComponentメタデータにプロバイダ[MyService]を追加してみてください。 – MikeDub

答えて

1

複数のクラスを1つのファイルに入れている場合(これはテスト専用です)、ファイルの順番を確認する必要があります。 AppComponentMyServiceを参照しているので、MyServiceの定義をAppComponentの上に置く必要があります。したがって、あなたのコードは次のようなものを見なければならない:

import { Component, ReflectiveInjector, Injectable, Inject } from '@angular/core'; 
import { BrowserModule } from '@angular/platform-browser'; 
import { NgModule } from '@angular/core'; 
import { FormsModule } from '@angular/forms'; 
import { HttpModule } from '@angular/http'; 

@Injectable() 
export class MyService { 
    constructor() {} 

    getValue(): string { 
     return 'a value'; 
    } 
} 

@Component({ 
    selector: 'app-root', 
    template: ` 
    <button (click)="invokeService()">Get Value</button> 
    ` 
}) 
export class AppComponent { 
    // private myService: MyService; 

    constructor(public myService: MyService) { 
     // let injector: any = ReflectiveInjector.resolveAndCreate([MyService]); 
     // this.myService = injector.get(MyService); 
     // console.log('Same instance? ', this.myService === injector.get(MyService)); 
    } 

    invokeService() { 
     console.log(this.myService.getValue()); 
    } 
} 

@NgModule({ 
    declarations: [ 
    AppComponent 
    ], 
    imports: [ 
    BrowserModule, 
    FormsModule, 
    HttpModule 
    ], 
    providers: [MyService], 
    bootstrap: [AppComponent] 
}) 
export class AppModule { } 
+0

トリックをしたWOW!チュートリアルでは、クラスが宣言された順序が重要であるとは言いません。加えて、エラーメッセージはやや誤解を招く - あなたが宣言しているか依存関係の権利などを提供しているかどうかを調べる...とにかく、助けてくれてありがとう! – user2072027

関連する問題