Angular 2 で動的コンポーネントを作成する際に、新しく作成したコンポーネントを DOM に追加するには、このプロセスが必要であることがわかりまし た。ViewContainerRef
そして、これらの動的に作成されたコンポーネントに渡す@Input
と、上記の2番目のリンクとここ@Output
に答えが見つかりました。
ただし、 などのさまざまな形状コンポーネントを返す関数を含む という名前のサービスを作成する場合、shape.service
DOMの場所を指定せずにこのサービスがコンポーネントを作成する方法と、container-component がこの返されたコンポーネントを受け取る方法がわかりません (おそらくそのタイプはサービスから) になり、指定された DOM コンテナー コンポーネントに注入されます。@Input
bgColor
ComponentRef
たとえば、サービスには次のメソッドが含まれます。
getCircle(bgColor:string): ComponentRef<Circle> {
let circleFactory = componentFactoryResolver.resolveComponentFactory(CircleComponent);
let circleCompRef = this.viewContainerRef.createComponent(circleFactory);
circleCompRef.instance.bgColor = bgColor;
return circleCompRef;
}
ここで最初の疑問が生じthis.viewContainerRef
ます。インポートする理由ViewContainerRef
は、コンポーネントを動的に作成するためです。
2 番目の質問は、container-componentcomponentRef
がサービスから特定の入力を受け取った後、DOM にどのように注入するかです。
更新: 上記の私の質問は十分に具体的ではなかったと思います。私は次のような状況にいます:
- 親コンポーネントはサービスを呼び出し、componentRef/s を取得します。
- componentRef/s を含むオブジェクトを他のデータと一緒に作成し、それらの作成されたオブジェクトを配列に格納します
- として子に渡します
@Input
。 - そして、各子が componentRef をその DOM に注入し、オブジェクト内の残りのデータを別の方法で使用できるようにします。
つまり、コンポーネントを呼び出しているサービスには、それらの componentRef がどこに注入されるかがわからないということです。つまり、いつでもどこでも注入できる独立したコンポーネント オブジェクトが必要です。
私はすでに rumTimeCompiler ソリューションを数回読んでいますが、それが実際にどのように機能するかはよくわかりません。viewContainerRefを使ったコンポーネント作成に比べて手間がかかりすぎるようです。他に解決策が見つからない場合は、さらに掘り下げます...