You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Angular中如何实现nzDropDownMenu模板引用的可复用性?

解决方案

提供两种可落地的实现方式,可根据项目实际场景选择:

方案1:使用ngTemplateOutlet实现单页面模板复用

适合仅在当前页面有大量重复表头的场景,无需新增组件:

  1. 先在当前页面模板顶部定义公共可复用模板,通过上下文传递动态参数:
<!-- 公共下拉菜单模板 -->
<ng-template #deptDropDownTpl let-field="field">
  <nz-dropdown-menu #menuRef="nzDropdownMenu">
    <app-drop-down-num
      *ngIf="userData"
      [isEmployment]="true"
      [fields]="field"
      [listOfDisplayData]="userData"
      (Reload)="Reload($event)"
      (ParentComponet)="ParentComponent($event)"
    ></app-drop-down-num>
  </nz-dropdown-menu>
</ng-template>
  1. 在组件ts文件中定义科室配置列表,后续新增科室只需在数组中追加配置即可:
// 组件类中定义配置
deptList = [
  { label: '心内科', field: 'cardiology' },
  { label: '皮肤科', field: 'dermatology' },
  { label: '男科', field: 'andrology' },
  // 其他科室直接加配置项
]
  1. 循环渲染表头,动态实例化公共模板:
<th *ngFor="let dept of deptList" nzCustomFilter>
  {{ dept.label }}
  <ng-container *ngTemplateOutlet="deptDropDownTpl; context: {field: dept.field}"></ng-container>
  <nz-filter-trigger
    [nzActive]="searchValue.length > 0"
    [nzDropdownMenu]="menuRef"
  >
    <i nz-icon nzType="search"></i>
  </nz-filter-trigger>
</th>

方案2:封装独立表头组件(推荐)

适合多页面都需要用到该筛选表头的场景,维护性更高:

  1. 新增自定义组件dept-filter-header,在组件类中定义输入输出参数:
// dept-filter-header.component.ts
import { Component, Input, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'app-dept-filter-header',
  templateUrl: './dept-filter-header.component.html'
})
export class DeptFilterHeaderComponent {
  @Input() deptLabel: string;
  @Input() deptField: string;
  @Input() userData: any[];
  @Input() searchValue: string = '';
  @Output() Reload = new EventEmitter<any>();
  @Output() ParentComponet = new EventEmitter<any>();
}
  1. 组件模板内容如下:
<!-- dept-filter-header.component.html -->
<th nzCustomFilter>
  {{ deptLabel }}
  <nz-dropdown-menu #menuRef="nzDropdownMenu">
    <app-drop-down-num
      *ngIf="userData"
      [isEmployment]="true"
      [fields]="deptField"
      [listOfDisplayData]="userData"
      (Reload)="Reload.emit($event)"
      (ParentComponet)="ParentComponet.emit($event)"
    ></app-drop-down-num>
  </nz-dropdown-menu>
  <nz-filter-trigger
    [nzActive]="searchValue.length > 0"
    [nzDropdownMenu]="menuRef"
  >
    <i nz-icon nzType="search"></i>
  </nz-filter-trigger>
</th>
  1. 父页面直接调用组件即可,新增科室仅需加一行代码:
<app-dept-filter-header
  deptLabel="心内科"
  deptField="cardiology"
  [userData]="userData"
  [searchValue]="searchValue"
  (Reload)="Reload($event)"
  (ParentComponet)="ParentComponent($event)"
></app-dept-filter-header>

<app-dept-filter-header
  deptLabel="皮肤科"
  deptField="dermatology"
  [userData]="userData"
  [searchValue]="searchValue"
  (Reload)="Reload($event)"
  (ParentComponet)="ParentComponent($event)"
></app-dept-filter-header>

内容的提问来源于stack exchange,提问作者Damien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 22:18:00