I want to get the innerHTML of ng-template to my component. Something like
HTML
<my-comp [template]="myTemplate"></my-comp>
<ng-template #myTemplate></ng-template>
TS
export class MyComponent implements OnInit {
@Input() template: string | TemplateRef<any>;
ngOnInit(){
console.log(this.template);
}
}
I needed to solve exactly the same problem today and found this question. I ended up looking into ng-bootstrap in order to see how they did it, and ultimately it's a fairly simple solution.
You need to get hold of ViewContainerRef that you want your string/TemplateRef to be inserted to. This can be either the host element (ViewContainerRef injected in constructor) or ViewChild. e.g:
or
next, in ngOnInit() you need to do an if/else depending if the input is TemplateRef or string and assign it to viewContainerRef:
Hope that helps!
Since you only require a shell into which a template will be injected, consider using a Directive instead of a component.
Now you can apply that directive to any element, and the provided
template-host
binding will cause html injection in that element. For example:Live demo
If your class actually has a template, but you want to inject html into only a portion of that template, learn about transclusion