如何从其他Angular组件使用`templateref`?

时间:2018-10-30 15:56:15

标签: angular

如何使用其他组件模板文件中的templateRef

我有BatmanComponentSpidermanComponent和一个JokerComponent。其中一些具有相似的功能,因此我决定创建一个HumanComponent,并将所有可重复使用的HTML代码放入该文件中,如下所示:

注意:HumanComponent永远不会使用,它只是一个包含所有默认模板的文件。

// human.component.ts
<ng-template #eye>
    Eyes: {{ size }}
</ng-template>
<ng-template #body>
    Body: bust {{ x[0] }}, waist {{ x[1] }}, hip {{ x[2] }} 
</ng-template>

我可以知道如何注入这些模板(来自 human.component.ts )并在batman.component.ts等内部使用它吗?

我知道我可以这样做:(仅如果模板代码正在复制粘贴在 batman,spiderman和joker HTML文件中)

// batman.component.ts
<ng-container *ngTemplateOutlet="eye; context: contextObj"></ng-container>

<ng-template #eye> ... </ng-template> <!-- need to copy/paste here, and use it locally -->

我可以知道如何导出 templateRef到其他文件,然后重新使用它们吗?我不想在这些文件中复制和粘贴类似的代码,希望我可以有一个默认的模板文件,然后将这些代码导出到任何想要的人。可能吗?


更新

在阅读评论后,我决定使用可重用组件而不是这种“技术” ...也许Angular团队正在努力优化可重用组件方法(如@artyom, @rafael,建议使用@ibenjelloun),那么可能只需走他们的路就可以了……哈哈...

无论如何,谢谢。

1 个答案:

答案 0 :(得分:2)

如果创建TemplatesService,则可以在其中注册模板并在其他组件中使用它们:

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class TemplatesService {
  templates = {};
  add(name: string, ref) {
    this.templates[name] = ref; 
  }
  get(name: string) {
    return this.templates[name];
  }
}

然后您可以从根组件将模板添加到服务:

{{ _templatesService.add('template1', template1) }}
{{ _templatesService.add('template2', template2) }}

<ng-template #template1 let-name="name">
  ****** Template 1 {{name}} ******
</ng-template>

<ng-template #template2 let-name="name">
  ----- Template 2 {{name}} ------
</ng-template>

并在另一个组件中使用它们:

<ng-container *ngTemplateOutlet="_templatesService.get('template1'); 
 context: {name: 'From Hello Component'}"></ng-container>

Here is a stackblitz demo.