2016-03-24 6 views
0

私はMetaManagerクラスを持っている:を注入クラスの配列

@Injectable() 
export class MetaManager{ 

    constructor(private handlers:Handler[]){ 
     console.log(handlers); 
    } 
} 

このクラスはハンドラとして登録するHandler[]を必要とします。私がメタデータを取得したときよりも、私のハンドラ配列をループして、どちらがメタエントリをハンドリングできるかを調べます。文字列のエントリを使用して

(と:

は、ここに私が試してみました(と何が動作しませんでした)何か問題は、私はmain.tsで設定としてクラスの配列を提供することができないということである、と述べましたMetaManagerで@Provide('HANDLERS')注釈:Handler[]クラスプロバイダを使用

export const HANDLERS: HandlerConfig = {handlers: [<Handler>DebugHandler]}; 

bootstrap(AppComponent, [MetaManager, provide(HandlerConfig, {useValue: HANDLERS}) ]); 

`bootstrap(AppComponent, [MetaManager,provide('HANDLERS', {useValue: [DebugHandler]}) ]);` 

ハンドラを提供するインターフェイスを使用し

MetaManagerは、将来的に複数のハンドラを持っている必要がありますので、私はクラスの配列を提供したい
bootstrap(AppComponent, [MetaManager, provide(Handler[], [DebugHandler])]); 

、通知、エラー、等...

EDIT:マルチプロバイダを使用して

ができます私No provider for Array! (ApiService -> MetaManager -> Array)エラー:

メタmanager.ts:

@Injectable() 
export class MetaManager{ 

    constructor(private handlers:Handler[]){ 
     console.log(handlers); 
    } 
} 

main.ts:

bootstrap(AppComponent, 
    [ MetaManager, 
     provide(Handler, {useClass: DebugHandler, multi: true}), 
     provide(Handler, {useClass: NotificationHandler, multi: true})]); 

答えて

6

あなたはHandlerクラスのためのあなたのプロバイダを登録するときにmulti属性を使用することができます。

bootstrap(AppComponent, [ 
    MetaManager, 
    provide(Handler, { useClass: DebugHandler, multi: true }), 
    provide(Handler, { useClass: OtherHandler, multi: true }) 
]); 

この方法は、あなたがこの方法を注入することができるようになります:

@Injectable() 
export class MetaManager{ 
    constructor(@Inject(Handler) private handlers:Handler[]){ 
    console.log(handlers); 
    } 
} 

ここに対応するplunkr:https://plnkr.co/edit/UBIvWfOvAmo4XO2ohbID?p=previewがあります。 この記事では、あなたの興味ができます

+0

はい、でも何であれば、私はすべてのハンドラが登録を取得したいの?また、どのようにそれらのすべてを取得するには? – Supamiu

+0

注入配列には、登録されているすべてのハンドラが含まれています。おそらく私はあなたの質問を誤解しました。私は自分の答えを更新しました... –

+0

マルチアプローチでは、プロバイダを1つずつ登録する必要があります。このトークンのすべての登録プロバイダは、配列として提供されます... –

関連する問題