2016-08-27 26 views
0

私はインターフェイス用に2つの実装を作成し、それらの実装を2つの異なるコンポーネントのプロバイダとして提供しました。このエラーが発生しました。エラー:ChildComponentのすべてのパラメータを解決できません:(?)。角2 - DIが動作しない

どこが間違っていますか?

interface MyInterface { 
    log(msg: string): void 
} 

class DebugService implements MyInterface { 
    public log(msg:string) { 
     console.debug(msg); 
    } 
} 

class ErrorService implements MyInterface { 
    public log(msg: string) { 
     console.error(msg); 
    } 
} 


import { Component } from '@angular/core'; 

@Component({ 
    selector: 'my-app', 
    template: '<div (click)="log()">Root Component</div><my-child></my-child><my-child></my-child>' //app/app.component.html 
    , providers: [DebugService] 
}) 
export class AppComponent { 
    private dummy: MyInterface; 
    constructor(d: MyInterface) { 
     this.dummy = d; 
    } 
    log() { 
     this.dummy.log("Root"); 
    } 
} 


@Component({ 
    selector: 'my-child', 
    template: `<h4 (click)="log()"> Hello Child</h4>`, 
    providers: [ErrorService] 
}) 
export class ChildComponent { 
    private dummy: MyInterface; 
    constructor(d: MyInterface) { 
     this.dummy = d; 
    } 
    log() { 
     this.dummy.log("Child"); 
    } 
} 

答えて

2

依存性注入を使用するには、サービスを@Ajectableデコレータでマークする必要があります。また、インタフェースを挿入することができない場合は、提供したクラスを注入する必要があります。

@Injectable() 
class ErrorService implements MyInterface { 
    public log(msg: string) { 
     console.error(msg); 
    } 
} 
@Component({ 
    selector: 'my-child', 
    template: `<h4 (click)="log()"> Hello Child</h4>`, 
    providers: [ErrorService] 
}) 
export class ChildComponent { 
    constructor(private dummy: ErrorService) {} 
    log() { 
     this.dummy.log("Child"); 
    } 
} 
0

Angular websiteによると、「インターフェイスは、純粋に技術的な観点から、JavaScriptと活字体の開発者のためのオプションです。JavaScript言語はインターフェイスがありません。彼らはから消えているため角度は、実行時に活字体のインタフェースを見ることができません翻訳されたJavaScript。

このため、インターフェイスを使用して具体的な実装をリクエストすることはできません。

@Injectable()はDIが動作するために必要なデコレータではありません。そのサービスが他のサービスに依存している場合にのみ、サービスクラスに装飾されます。

+0

これは正しくありません。 [@angularドキュメント](https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#injectable)にあるように、DIが動作するためには@Injectable()*が必要です。 @Injectable()としてマークされていないクラスをインスタンス化しようとすると、インジェクタはエラーを報告します。_ – nickspoon

+1

@nickspoon - anあなたが提供したドキュメントのリンクから抽象的に、「依存関係を持たず、技術的に必要としないものであっても、すべてのサービスクラスにInjectable()を追加することをお勧めします。注入可能なデコレータは、サービスが他のサービスに依存している場合にのみ必要です。 Angularドキュメンテーションは、必須ではないが、サービスクラスの依存関係がなくても、Injectable()を使ってサービスクラスを修飾するのは "規約"です。 – user1176058

+0

申し訳ありませんが、あなたが正しいです、私はちょうどテストし、依存関係のないサービスは '@Injectable()'なしで注入できます。あなたの質問に対する答えは、あなたが私の答えで言ったように、あなたの具体的なサービスを注入する必要があり、この例で '@Injectable()'を使用することは、ベストプラクティスにすぎません。 – nickspoon

関連する問題