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

如何在Angular 7中添加此类列表?适配TEST workflow数据的分组条目需求

嘿,我来帮你搞定Angular 7里的分组列表!要适配不同TEST workflow的数据,咱们可以分几步来实现,思路很清晰:先统一数据结构,再做分组处理,最后在模板里渲染出分组后的列表。

步骤1:定义适配多TEST workflow的数据结构

不管你从哪个TEST workflow获取数据,首先要把它们统一成便于分组的格式。咱们先定义一个通用的条目接口,包含分组依据字段(比如workflowName,用来区分不同的TEST workflow)和你需要展示的内容字段:

// 在组件文件中定义条目接口
interface TestItem {
  id: number;
  name: string;
  status: string;
  workflowName: string; // 核心分组字段,对应不同TEST workflow的标识
}

// 示例数据(模拟来自不同TEST workflow的返回结果)
testData: TestItem[] = [
  { id: 1, name: '测试用例A', status: '通过', workflowName: '回归测试' },
  { id: 2, name: '测试用例B', status: '失败', workflowName: '冒烟测试' },
  { id: 3, name: '测试用例C', status: '通过', workflowName: '回归测试' },
  { id: 4, name: '测试用例D', status: '跳过', workflowName: '冒烟测试' },
];

如果不同TEST workflow返回的字段名不一样(比如有的叫testCaseName而非name),你可以在获取数据后做一层映射,把它们转成统一的TestItem结构,这样后续分组逻辑就不用改了。

步骤2:实现数据分组逻辑

这里有两种常用方式,你可以根据场景选:

方式一:组件内直接处理(适合简单场景)

在组件的ngOnInit钩子中,把原始数组转成分组后的对象——键是分组名(比如不同的TEST workflow名称),值是对应分组下的条目数组:

groupedTestData: { [key: string]: TestItem[] } = {};

ngOnInit(): void {
  // 遍历原始数据,按workflowName分组
  this.testData.forEach(item => {
    const workflowKey = item.workflowName;
    // 如果当前分组不存在,先初始化空数组
    if (!this.groupedTestData[workflowKey]) {
      this.groupedTestData[workflowKey] = [];
    }
    this.groupedTestData[workflowKey].push(item);
  });
}

方式二:自定义分组管道(适合复用场景)

如果你的项目中多个组件都需要分组功能,写一个自定义管道会更高效。先创建group-by.pipe.ts文件:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({ name: 'groupBy' })
export class GroupByPipe implements PipeTransform {
  transform(collection: any[], groupField: string): { key: string; value: any[] }[] {
    if (!collection || !groupField) return [];
    
    // 用reduce方法分组,最后转成便于模板遍历的数组格式
    const groupedObj = collection.reduce((groups, item) => {
      const key = item[groupField];
      if (!groups[key]) {
        groups[key] = [];
      }
      groups[key].push(item);
      return groups;
    }, {} as { [key: string]: any[] });

    // 把对象转成[{key: '分组名', value: [条目数组]}]的格式
    return Object.keys(groupedObj).map(key => ({
      key,
      value: groupedObj[key]
    }));
  }
}

然后在你的模块(比如AppModule)中声明这个管道:

import { GroupByPipe } from './group-by.pipe';

@NgModule({
  declarations: [
    // ...你的其他组件、指令
    GroupByPipe
  ],
  // ...其他配置
})
export class AppModule { }
步骤3:在模板中渲染分组列表

现在就可以把分组后的数据渲染成你想要的列表样式了:

用组件内处理的分组数据渲染

<div class="grouped-test-list">
  <!-- 遍历每个分组 -->
  <div *ngFor="let workflowName of Object.keys(groupedTestData)" class="workflow-group">
    <!-- 分组标题 -->
    <h3 class="group-title">{{ workflowName }}</h3>
    <!-- 遍历分组下的条目 -->
    <ul class="test-item-list">
      <li *ngFor="let item of groupedTestData[workflowName]" class="test-item">
        <span class="item-name">{{ item.name }}</span>
        <!-- 可以根据状态加样式 -->
        <span class="item-status" [ngClass]="item.status.toLowerCase()">
          {{ item.status }}
        </span>
      </li>
    </ul>
  </div>
</div>

用自定义管道渲染

<div class="grouped-test-list">
  <!-- 直接用管道处理原始数据 -->
  <div *ngFor="let group of testData | groupBy: 'workflowName'" class="workflow-group">
    <h3 class="group-title">{{ group.key }}</h3>
    <ul class="test-item-list">
      <li *ngFor="let item of group.value" class="test-item">
        <span class="item-name">{{ item.name }}</span>
        <span class="item-status" [ngClass]="item.status.toLowerCase()">
          {{ item.status }}
        </span>
      </li>
    </ul>
  </div>
</div>
扩展:适配不同TEST workflow的小技巧
  • 动态分组:如果有时候需要切换分组依据(比如按status分组而非workflowName),可以把分组字段做成组件变量,比如currentGroupField = 'workflowName',然后在模板或逻辑中替换这个变量即可。
  • 样式优化:可以给分组标题加折叠/展开功能(用*ngIf和点击事件控制条目显示),或者给不同TEST workflow的分组加不同的背景色,提升可读性。
  • 异步数据处理:如果数据是从接口异步获取的,记得把分组逻辑放在subscribe回调里,或者用async管道配合管道使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:40:35