创建TemplateRef并将其插入组件的模板中

时间:2017-11-18 23:00:15

标签: angular

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

1 个答案:

答案 0 :(得分:1)

您想要的是拥有动态模板。这样您以后就可以放置模板而无需更改相同的组件。

现在如何实现呢?

创建主要组件以渲染模板。 <main-component>

main.component.html

<div class="box">
  <ng-container [ngTemplateOutlet]="template" [ngTemplateOutletContext]="context"></ng-container>
</div>

main.component.ts

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.component.html

<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>

输出

enter image description here

工作演示在这里https://stackblitz.com/edit/angular-yzkwrq