templateを利用して動的にコンポーネントを生成する
this.viewContainer.createEmbeddedView(this.templateRef);
- 何が起きているか
- Angularが生成した
<ng-template>
を利用して、embedded viewを作成。作成したembedded viewをホスト要素に隣接するview containerに差し込む
- 隣接とは
createEmbeddedView
- templateRefからEmbeddedViewRefを生成してinsert
createComponent
- ComponentFactoryからComponentRefを生成してinsert
insert(viewRef: ViewRef, index?: number): ViewRef
clear(): void
- 2つの利用方法
<ng-template>
に配置されたディレクティブ(or directive prefixed with *)
- Query
サンプル
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[appUnless]'
})
export class UnlessDirective {
private hasView = false;
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef) { }
@Input() set appUnless(condition: boolean) {
if (!condition && !this.hasView) {
this.viewContainer.createEmbeddedView(this.templateRef);
this.hasView = true;
} else if (condition && this.hasView) {
this.viewContainer.clear();
this.hasView = false;
}
}
}
参考