1

私は MetaManager クラスを持っています:

@Injectable()
export class MetaManager{

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

このクラスは、Handler[]ハンドラーとして登録する必要があります。それよりも、メタデータを取得したら、handlers 配列をループして、メタ エントリを処理できるのはどれかを確認します。

そうは言っても、問題は、main.ts で構成としてクラスの配列を提供できないことです。

文字列エントリの使用 ( @Provide('HANDLERS')MetaManager の注釈付き:

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

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

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

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

Handler[]クラス プロバイダーの使用:

bootstrap(AppComponent, [MetaManager, provide(Handler[], [DebugHandler])]);

MetaManager将来、複数の Handler 、通知、エラーなどが必要になるため、クラス配列を提供したい...

編集:

マルチプロバイダーを使用するとNo provider for Array! (ApiService -> MetaManager -> Array)エラーが発生します:

meta-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})]);
4

1 に答える 1

8

クラスmultiのプロバイダーを登録するときに属性を使用できます。Handler

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。この記事はあなたに興味があるかもしれません:

于 2016-03-24T17:02:14.620 に答える