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

如何在Angular中实现支持层级子分类的树形多选下拉菜单

Angular 树形结构下拉多选组件实现方案

你当前使用的ng-multiselect-dropdown原生不支持层级树形结构,可通过以下两种方案实现需求:


方案1:基于现有组件改造(最小改动,无需更换依赖)

该方案通过自定义选项模板、添加层级缩进模拟树形效果,可直接复用现有逻辑:

步骤1:调整TS代码

修改下拉列表数据结构,新增parent_id、level字段标记层级,补充父子联动逻辑:

export class UserComponent implements OnInit {
  // 扩展数据类型,新增层级相关字段
  dropdownList: { item_id: number; item_text: string; parent_id?: number; level?: number; isParent?: boolean }[] = [];
  selectedItems: { item_id: number; item_text: string; }[] = [];
  dropdownSettings : IDropdownSettings;

  constructor(public service: UserService) { }

  ngOnInit(): void {
    // 补充树形结构数据
    this.dropdownList = [
      { item_id: 1, item_text:'North Spine', level: 0, isParent: true },
      { item_id: 11, item_text:'N1', parent_id: 1, level: 1 },
      { item_id: 111, item_text:'N1.1', parent_id: 11, level: 2 },
      { item_id: 112, item_text:'N1.2', parent_id: 11, level: 2 },
      { item_id: 113, item_text:'N1.3', parent_id: 11, level: 2 },
      { item_id: 2, item_text: 'Academics', level: 0 },
      { item_id: 3, item_text: 'Staff Housing', level: 0 },
      { item_id: 4, item_text: 'Student Hall', level: 0 },
    ];
    this.selectedItems = [
      { item_id: 3, item_text: 'Staff Housing' },
      { item_id: 4, item_text: 'Academics' }
    ];
    
    this.dropdownSettings = {
      singleSelection: false,
      idField: 'item_id',
      textField: 'item_text',
      selectAllText: 'Select All',
      unSelectAllText: 'UnSelect All',
      itemsShowLimit: 4,
      allowSearchFilter: true
    };
  }

  // 勾选时添加父子联动逻辑
  onItemSelect(item: any) {
    // 如果勾选的是父级,自动勾选所有子项
    if(item.isParent) {
      const children = this.dropdownList.filter(i => i.parent_id === item.item_id);
      children.forEach(child => {
        if(!this.selectedItems.find(s => s.item_id === child.item_id)) {
          this.selectedItems.push(child);
        }
      })
    }
    console.log(item);
  }
  onSelectAll(items: any) {
    console.log(items);
  }
  // 移除选项时可按需添加父子联动取消逻辑
}

步骤2:调整HTML代码

添加自定义选项模板,通过层级控制缩进,模拟树形视觉效果:

<div class="col-sm-6 form-group">
  <label for="Building">Authorized Building</label>
  <ng-multiselect-dropdown 
    [placeholder]="'Select the Building'" 
    [settings]="dropdownSettings"
    [data]="dropdownList" 
    [(ngModel)]="selectedItems" 
    (onSelect)="onItemSelect($event)"
    (onSelectAll)="onSelectAll($event)">
    <!-- 自定义下拉选项模板,添加缩进 -->
    <ng-template #optionsTemplate let-item="item">
      <span style="padding-left: {{item.level * 16}}px">
        {{item.isParent ? '📂 ' : '📄 '}}{{item.item_text}}
      </span>
    </ng-template>
  </ng-multiselect-dropdown>
</div>

该方案缺点是仅为视觉层级,不支持父节点折叠展开,适合层级少、结构简单的场景。


方案2:替换为原生支持树形的下拉组件(推荐,功能更完善)

如果需要支持折叠展开、父子级联动等完整树形功能,建议更换为ngx-tree-select或Angular Material 树选择组件,原生支持层级结构配置,直接传入嵌套的树形数据即可实现效果图的交互效果:
参考效果图
实现后可支持父节点折叠、勾选父级自动选中所有子级、所有选中项均展示在标签区域且支持单独移除,完全匹配需求。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 21:45:08