代码之家  ›  专栏  ›  技术社区  ›  Chris Barr

动态选择ng模板

  •  1
  • Chris Barr  · 技术社区  · 6 年前

    我有一些角度模板,我希望能够在组件模板的特定区域中动态选择和显示这些模板。下面是我正在尝试做的一些简化示例代码。

    我似乎使用 @ViewChild 以这种方式“保存”对类属性的模板引用要么不起作用,要么我在这里误解了什么。

    在里面 example.component.ts

    import { Component, TemplateRef, ViewChild } from '@angular/core';
    
    interface INamedTmplExample {
      name: string;
      template: TemplateRef<object>;
    }
    
    @Component({
      selector: 'app-example',
      templateUrl: './example.component.html',
    })
    export class BulkActionsComponent {
      @ViewChild('templateOne') private tmpl1: TemplateRef<object>;
      @ViewChild('templateTwo') private tmpl2: TemplateRef<object>;
    
      public tmpls: INamedTmplExample [] = [
        { name: 'One', template: this.tmpl1},
        { name: 'Two', template: this.tmpl2},
      ];
      public selectedTmpl: INamedTmplExample | undefined;
    
      public selectTemplate(tmpl: INamedTmplExample ): void {
        this.selectedTmpl= tmpl;
      }
    }
    

    然后进来 example.component.html :

    <h1>Choose One</h1>
    <button type="button"
            *ngFor="let t of tmpls"
            (click)="selectTemplate(t)">
      {{t.name}}
    </button>
    
    <ng-container *ngIf="selectedTmpl">
      <h2>You have selected {{selectedTmpl?.name}}</h2>
     <ng-container *ngTemplateOutlet="selectedTmpl?.template"></ng-container>
    </ng-container>
    
    <ng-template #templateOne>
      <h3>One</h3>
    </ng-template>
    <ng-template #templateTwo>
      <h3>Two!</h3>
    </ng-template>
    

    我还尝试过如下调试:

    <pre class="border bg-light p-2">{{tmpls| json}}</pre>
    <pre class="border bg-light p-2">{{selectedTmpl| json}}</pre>
    

    但这只是表明 INamedTmplExample 对象,使用 template 属性已省略!

    请告诉我,我不知道如何才能在这里做我想做的事。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Frank Modica    6 年前

    尝试收集您的 ViewChild 中的元素 ngAfterViewInit 挂钩:

    public tmpls: INamedTmplExample [];
    
    ngAfterViewInit() {
        this.tmpls = [
            { name: 'One', template: this.tmpl1},
            { name: 'Two', template: this.tmpl2},
        ];
    }