动态ngTemplateOutlet值

13
有没有一种方法可以动态设置 *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>

当然,它不起作用,但我想这相当清楚地解释了我想要实现的目标:如果项目是“div”,则应显示#div模板,如果是“span”,则应显示#span模板。


1
去掉item周围的双括号,它就可以工作了。 - Dan
如果我只是删除括号,它将显示 #item 模板,但该模板并不存在。这意味着它将什么也不显示。 - atcastroviejo
尝试将项目用括号括起来,以便将其作为表达式进行评估。 *ngTemplateOutlet="(item.ref)" 如果这样不行,请使用 let item of [ { ref: 'div' }, { ref: 'span'} ] 并使用 *ngTemplateOutlet="item.ref"。请查看此示例。https://dev59.com/pVkS5IYBdhLWcg3wECuU - Dan
3个回答

19

只需将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的函数。


在 *ngTemplateOutlet 中,当 TemplateRef 改变时是否存在任何事件发射器? - Experimenter
据我所知没有,但你可以使用我在答案最后一句中提到的函数方法,可能会在那里捕捉到变化。 - TimTheEnchanter
我在这里找到了我的问题的答案:https://dev59.com/sVkS5IYBdhLWcg3w8ai-#48229998 无论如何,谢谢! - Experimenter

1
Here is the shortest and best feasible solution.
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>

在您的组件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>

-1

将项目用括号括起来以使其作为表达式进行评估。 *ngTemplateOutlet="(item.ref)" 如果这样不起作用,请使用 let item of [ { ref: 'div' }, { ref: 'span'} ] 并使用 *ngTemplateOutlet="item.ref"无法让ngTemplateOutlet工作 类似


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接