有没有办法动态设置* ngTemplateOutlet指令的值?
沿着这些方向:
<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>
当然它不起作用,但我想它很好地解释了我想要实现的目标:如果项目是&#34; div&#34;,那么它应该显示#div模板,如果它&#34; span&#34; #span one。
答案 0 :(得分:8)
只需将ngTemplateOutlet
指向TemplateRef
的变量:
在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>
在代码中:
@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;
}
您还可以将ngTemplateOutlet
指向返回TemplateRef
的函数。
答案 1 :(得分:1)
这是最短和最佳可行的解决方案
1 创建指令“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 在你的组件 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 在你的组件 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 在 helper-content.component.html 中使用 helpTemplate 变量
<div class="content" >
<ng-container *ngTemplateOutlet="helpTemplate"></ng-container>
</div>
答案 2 :(得分:-1)
在括号中包装项目以使其作为表达式进行评估。 *ngTemplateOutlet="(item.ref)"
如果这不起作用,请执行let item of [ { ref: 'div' }, { ref: 'span'} ]
并使用*ngTemplateOutlet="item.ref"
与Can't get ngTemplateOutlet to work类似