angular - 根据类型渲染动态模板

标签 angular typescript angular8

我真的很喜欢 Dynamic template based on value rather than variable with ngTemplateOutlet 提供的答案。但是我无法让它工作。简化示例:

export class A {
}

export class MyComponent 
  implements OnInit {

  public controls$ = Observable<any[]>([]);

  ngOnInit() {
    this.controls$.next([new A()]);
  }

  public getTypeName(control: any) {
    if (control instanceof A) {
      return "AControl";
    }
    return "";
  }
}

模板:

<div *ngFor="let control of control$ | async">
  {{ getControlType(control) }}
</div>

产量:

AControl

到目前为止一切顺利。当我添加模板时,出现异常:

<div *ngFor="let control of control$ | async">
  {{ getControlType(control) }}
  <ng-container 
    [ngTemplateOutlet]="getControlType(control)"
    [ngTemplateOutletContext]="{ control: control }">
  </ng-container>
</div>

<ng-template 
  #AControl 
  let-item="control">A Control</ng-template>

抛出:

templateRef.createEmbeddedView is not a function

我不确定需要更改哪些内容才能使模板 #AControl 在容器中呈现。

最佳答案

似乎[ngTemplateOutlet]="getControlType(control)"是罪魁祸首。我没有看到 getControlType() 的代码,但我认为它返回一个 s 字符串,而它应该是一个 TemplateRef 对象。除非您使用 ChangeDetectionStrategy.OnPush,否则在模板中调用函数并不是一个好主意,因此我建议在模板中使用 switch 语句。尽管如此,随着

@ViewChild("AControl", {static: true})
AControl: TemplateRef<any>;

您可以访问 .ts 文件中的模板并从 getControlType 函数返回

关于angular - 根据类型渲染动态模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58584555/

相关文章:

typescript - 如果文件未打开,Vscode 不会显示 typescript 错误

angular - Angular `ngOnInit` 中的异步/等待

javascript - 如何忽略 NestJS 中特定路由的拦截器

angular - 尽管 DELETE 出错,实体仍从缓存中移除

angular - 如何在 Observable.forkJoin() 中使用动态参数(url)

javascript - 如何在 Angular typescript 中使用 Timetable.js?

Angular2 patchValue JSON 数据到 formArray

angular - 如何直接将 HTTP 响应分配给 Angular 中的接口(interface)模型类型

angular - 如何在其他scss文件中使用 Angular Material 主题颜色变量

javascript - 在 Angular JS 中删除下划线并添加财政年度