Is there a way to dynamically set the value of the *ngTemplateOutlet directive?
Something along those lines:
<div *ngFor="let item of [ 'div', 'span' ]">
<ng-container *ngTemplateOutlet="{{ item }}"></ng-container>
</div>
<ng-template #div>
<div>some text inside a div</div>
</ng-template>
<ng-template #span>
<span>some text inside a span</span>
</ng-template>
Of course it doesn't work but I guess it explains quite well what I'm trying to achieve: if the item is "div", then it should display the #div template, if it's "span" the #span one.
Just point ngTemplateOutlet
at a variable that is a TemplateRef
:
In HTML:
<button (click)="toggleTemplateSelected()">Toggle Template</button>
<br />
<p>Showing
<span class='viewType' *ngIf="showViewTemplate">C</span>
<span class='viewType' *ngIf="!showViewTemplate">C2</span>
template:</p>
<ng-container *ngTemplateOutlet='liveTemplate'></ng-container>
<!--Templates: -->
<ng-template #tmplC>
Hello from TemplateC
</ng-template>
<ng-template #tmplC2>
Hello from TemplateC2
</ng-template>
In code:
@ViewChild('tmplC') tmplC: TemplateRef<any>;
@ViewChild('tmplC2') tmplC2: TemplateRef<any>;
showViewTemplate = true;
liveTemplate: TemplateRef<any>;
toggleTemplateSelected() {
this.showViewTemplate = !this.showViewTemplate;
this.liveTemplate = this.showViewTemplate ? this.tmplC : this.tmplC2;
}
You could also point ngTemplateOutlet
at a function that returns a TemplateRef
.
Here is the shortest and best feasible solution
1 Create Directive "dynamic-template.directive.ts"
import { Directive, Input, TemplateRef } from '@angular/core';
@Directive({
selector: '[dynamic-template]'
})
export class DynamicTemplateDirective {
@Input() id: number;
constructor(public template: TemplateRef<any>) { }
}
2 Define dynamic template in your component helper-content.component.html
<ng-template [dynamic-template] [id]="1">
This is 1st Template
</ng-template>
<ng-template [dynamic-template] [id]="2">
This is 2nd Template
</ng-template>
<ng-template [dynamic-template] [id]="3">
This is 3rd Template
</ng-template>
3 use dynamic template in your component helper-content.component.ts
import { DynamicTemplateDirective } from '@app/components/dynamic-template.directive';
export class HelperContentComponent implements OnInit {
helpTemplate: TemplateRef<any>;
@ViewChildren(DynamicTemplateDirective) templateRefs: QueryList<DynamicTemplateDirective>;
constructor(private eventService: EventEmitterService) {
}
getTemplate(templateId: number): TemplateRef<any> {
return this.templateRefs.toArray().find(x => x.id == templateId).template;
}
showHelperContent(id: number) {
this.helpTemplate = this.getTemplate(id);
}
}
4 Use helpTemplate variable in helper-content.component.html
<div class="content" >
<ng-container *ngTemplateOutlet="helpTemplate"></ng-container>
</div>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With