2

サービスにabstarct-child.service、そうのような:角度2ジェクトの複雑なサービスは、私は3つのサービスと一つの成分を持っている

import {Injectable} from 'angular2/core'; 
import {AbstractChildService} from './abstarct-child.service'; 

@Injectable() 

export class RootService { 
    constructor(private _abstractChildService: AbstractChildService) {} 
    UseChildServiceDoSomethingFunction(){} 
} 

abstarct-child.serviceは、のようなので、見える:

import {Injectable} from 'angular2/core'; 

@Injectable() 
export abstract class AbstractChildService { 
    abstract doSomething(): any ; 
} 

extend-child.serviceはそうのように見える:

import {Injectable} from 'angular2/core'; 
import {AbstractChildService} from './abstarct-child.service'; 

@Injectable() 
export class ExtendChildService extends AbstractChildService{ 

    constructor(private _num: number) { super(); } 
    doSomething() : any { return true; } 
} 

app.componentroot.serviceととしてextend-child.serviceを提供しますabstract-child.serviceように:

import {Component} from 'angular2/core'; 
import {Input} from 'angular2/core'; 
import {provide} from 'angular2/core'; 
import {RootService} from './root.service'; 
import {AbstractChildService} from './abstarct-child.service'; 
import {ExtendChildService} from './extend-child.service'; 

@Component({ 
    selector: 'app', 
    providers: [provide(AbstractChildService, { useClass: ExtendChildService, useValue: this.num})] 
}) 
export class AppComponent { 
    @Input('given_Num') num: number; 
} 

私はこの場合app.componentthis.numで、extend-child.serviceオブジェクトに注入することができる方法を知っていただきたいと思いますか?

私が間違っていることを誰でも見つけることができますか?

ありがとうございました。

答えて

2

私はまだ完全にあなたが達成しようとするものを考え出したていないが、

provide(AbstractChildService, { 
     useClass: ExtendChildService, 
     useValue: this.num}) 

は有効なプロバイダではありません。

useClassuseValueパラメータは、1つのプロバイダで1つずつしか使用できません。

また、@Component()デコレータのプロバイダでthis.を使用することはできません。デコレータが評価されるとき、まだthis.が参照できるコンポーネントのインスタンスはありません。

あなたは、文字列またはOpaqueToken

provide('MyNumber', {useValue: 10}), 

、それは別の方法、工場

provide(ExtendedChildService, {useFactory:() => { new ExtendedChildService(10)}); 
を使用することです

constructor(@Inject('MyNumber') private _num: number) { super(); } 

によって注入取得を使用することができます番号を提供する場合

でも、this.は参照できません。

+0

extend-child.serviceが依存性注入によって数値オブジェクトを取得するのを見ると、extend-child.serviceに数値を注入してから、root.serviceにextend-child.serviceを注入することはありません。多分私はこれが悪い方法なので、もし誰かが正しい方法を知っていれば? –

+0

私の答えで述べたように、あなたは数字だけをタイプすることはできません。プリミティブ型の場合、型と異なるキーが必要であり、 '@Inject( 'someKey')'をコンストラクタパラメータに追加します。さもなければ、DIはサーバー側で提供される 'string'(数値、ブール値、...)値を区別することができません。 –

+0

よく答えました。問題は、numパラメータがapp.componentに注入されたときに、app.componentがnumパラメータを注入する必要があることです。 –

関連する問題