Angular 5.0.2
基于NgTemplateOutlet
https://angular.io/api/common/NgTemplateOutlet
我想知道是否有办法动态创建TemplateRef,然后将其注入组件的模板。
例如,假设某个组件具有以下模板
<ng-container *ngTemplateOutlet="eng; context: myContext"></ng-container>
<ng-template #eng let-name><span>Hello {{name}}!</span></ng-template>
组件代码
class NgTemplateOutletExample {
myContext = {$implicit: 'World'};
}
我想要的是将其转换为具有以下模板的组件
<ng-container *ngTemplateOutlet="eng; context: myContext"></ng-container>
和像这样的组件代码
class NgTemplateOutletExample {
eng:TemplateRef = this.createTemplateRef('<ng-template #eng let-name><span>Hello {{name}}!</span></ng-template>');
myContext = {$implicit: 'World'};
}
是否可以从字符串创建TemplateRef
?
答案 0 :(得分:1)
您想要的是拥有动态模板。这样您以后就可以放置模板而无需更改相同的组件。
现在如何实现呢?
创建主要组件以渲染模板。 <main-component>
<div class="box">
<ng-container [ngTemplateOutlet]="template" [ngTemplateOutletContext]="context"></ng-container>
</div>
import { Component, OnInit, TemplateRef, ContentChild } from '@angular/core';
@Component({
selector: 'app-main',
templateUrl: './main.component.html',
styleUrls: ['./main.component.css']
})
export class MainComponent implements OnInit {
constructor() { }
@ContentChild("template")
template :TemplateRef<any>;
ngOnInit() {
}
get context(){
return this;
}
}
<app-main>
<ng-template #template>Content From First Template</ng-template>
</app-main>
<br>
<app-main>
<ng-template #template>Content From Second Template</ng-template>
</app-main>