2017-02-09 4 views
0

私はAngular2を学びたいと思っていますが、少し問題があります。私はその後、私はinput.componentサービスとプロバイダによる継承と多型

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

import { ParentService } from "./service/parent.service"; 

@Component({ 
    selector: 'app-input', 
    templateUrl: './input.component.html' 
}) 
export class InputComponent { 
    constructor(private parentService: ParentService) {} 

} 

そして、私のapp.componentに呼ばれるコンポーネントのクラスを持っている​​

export class ChildService extends ParentService { 

} 

呼ばParentService

export abstract class ParentService { 

} 

ParentServiceを拡張し、別のサービスクラスと呼ばれる抽象サービスクラスを持っています私はChildServiceのインスタンスを提供します

import { Component } from '@angular/core'; 
import { ChildService } from './service/child.service'; 

@Component({ 
    selector: 'app-root', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.css'], 
    providers: [ChildService] 
}) 
export class AppComponent { 

} 

ただし、これは機能しません。それは罰金構築しますが、アプリを実行しているとき、私は エラーが出る:

EXCEPTION: Error in ./AppComponent class AppComponent - inline template:4:16 caused by: No provider for ParentService! 

これを行うことは可能ですか? input.componentParentServiceを知りたいだけです。私は実際にそれが実装を知ってほしくはありません。

+0

あなたはこのパターンを避けるべきです –

+0

@AluanHaddadあなたはそれが悪い理由を詳述できますか? – eric

+0

継承は、あらゆる言語、特にJavaScriptで最小限に抑える必要があります。 JavaScriptにはインターフェイスがなく、TypeScriptインターフェイスが構造的なので、インターフェイスとしてクラスを使用しようとする人が多くいます。これはひどい練習です。実装するのではなく、インタフェースをプログラミングする必要があります。マニフェストインターフェイスのない言語でも同様です。 –

答えて

2

Angular2が自動的にサブクラスを元のクラス宣言にワイヤリングすることは期待できません。両方のサブクラスがサブタイトルDogServiceCatServiceの2つのサブクラスを持っている場合は、どちらもprovidersリストで宣言されています。

代わりに、あなたは明示的に指定する必要があります。

providers: [{provide: ParentService, useClass: ChildService}] 

ドキュメント:https://angular.io/docs/ts/latest/guide/dependency-injection.html

2

ことが可能ですが、少し追加しました。

@Component({ 
    selector: 'app-root', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.css'], 
    providers: [{provide: ParentService, useClass: ChildService}] 
}) 
export class AppComponent { 

} 

ここでは、角度2のDIはクラス間の関係を推論しようとしないということです。したがって、デフォルトではParentServiceを注入するためににParentService期間を指定する必要があります。しかし、幸いなことに、上記の構成でこの動作を無効にすることができます。これはDIコンテナに "誰かがParentServiceを求めて、代わりにChildServiceのインスタンスを作成して与えるかどうか"を文字通り伝えます。

+0

これは私に「ChildServiceのプロバイダがありません!」というエラーを表示していました。今。私のapp.moduleからmyApp.componentにChildServiceのインスタンスを提供する必要がありますか?私はそれを試して、それは今動作します。だから、私はAppComonentがChildServiceのインスタンスを作成しないと推測しています。 – eric

+0

申し訳ありません、そのコメントを無視してください。私はまだいくつかのコンポーネントでChildServiceを持っていました。それが私がエラーを受けている理由です。すべて今良い。ありがとう! – eric