コンポーネントが@Input()によって決定される注入された依存関係を必要とするAngular 2のコンポーネントディレクティブがあるとします。@Input()に基づく角度2の動的依存性注入
<trendy-directive use="'serviceA'">
のようなものを書いて、TrendyDirectiveのインスタンスにserviceAを使用させたいのですが、それが指定している場合はserviceBを使用してもらいたいと思います。 (これは私が実際に何をしようとしているの単純化しすぎたバージョンである)
は(あなたは、これがそもそもひどいアイデアだと思うならば、私はそのフィードバックに開いたんだけど、理由を説明してください。)
私が考えていることを達成する方法の一例です。この例では、ServiceAとServiceBが、両方とも 'SuperCoolFunction'を持つことでiServiceを実装するインジェクタブルであるとします。
@Component({
selector: 'trendy-directive',
...
})
export class TrendyDirective implements OnInit {
constructor(
private serviceA: ServiceA,
private serviceB: ServiceB){}
private service: iService;
@Input() use: string;
ngOnInit() {
switch (this.use){
case: 'serviceA': this.service = this.serviceA; break;
case: 'serviceB': this.service = this.serviceB; break;
default: throw "There's no such thing as a " + this.use + '!';
}
this.service.superCoolFunction();
}
}
私は、これは技術的に働くだろうと思うが、動的な依存性の注入を行うには良い方法があるように持っています。
4.0以降、 'get'は非推奨です。 –
私は署名を意味します。 https://github.com/angular/angular/blob/5.2.5/packages/core/src/di/injector.ts#L62 –
を参照してください。ジェネリックメソッドを型で呼び出す方が常に良いです。この署名が削除されるかどうかはわかりません。ジェネリックを使用する方が良いことをユーザーに知らせるためにそこにあります。いずれにせよ、私は注意を払って、答えを更新しました。通常、私はソリューションの徹底的なタイピングを心配することなく、その要点を提供することに集中します。 – estus