0

0

Angular 中 ngFor 嵌套渲染重复 rowspan 数据的解决方案

聖光之護

聖光之護

发布时间:2026-03-18 13:10:01

|

769人浏览过

|

来源于php中文网

原创

Angular 中 ngFor 嵌套渲染重复 rowspan 数据的解决方案

本文讲解如何在 Angular 模板中避免因嵌套 *ngFor 导致的 rowspan 内容重复渲染问题,核心是重构数据结构以匹配表格行合并逻辑,而非依赖条件渲染或 trackBy 技巧。

本文讲解如何在 angular 模板中避免因嵌套 *ngfor 导致的 `rowspan` 内容重复渲染问题,核心是重构数据结构以匹配表格行合并逻辑,而非依赖条件渲染或 trackby 技巧。

在使用 Angular 构建多层嵌套表格(如“主件—批次(rafale)—子件”结构)时,一个常见陷阱是:*将需跨行显示的父级数据(如 partQty 和 rowspan)保留在外层对象中,却在内层 `ngFor中反复访问它**。这会导致同一数值被多次渲染——正如你在示例中观察到的:refRaw.partQty在refRaw.rafale的每次迭代中都被重复输出,破坏了rowspan` 的语义与视觉效果。

根本原因在于:HTML 表格的 rowspan 属性仅控制单元格纵向跨越的行数,但不会自动阻止该单元格内容在后续 <tr> 中被再次插入。Angular 的 *ngFor 是纯模板指令,它不感知 DOM 渲染上下文或已渲染状态;试图用 *ngIf “跳过已遍历项”不仅逻辑复杂、易出错,更违背响应式设计原则——模板应声明“什么要渲染”,而非“什么时候不渲染”。

✅ 正确解法:让数据结构对齐 UI 结构

将原本属于 refRaw(父级物料)的 partQty 和 rowspan 下沉至每个 rafale 项中。只有真正需要展示该数量的 rafale 才携带该字段;其余同组 rafale 项则留空或省略。这样,模板可直接绑定,无需条件判断:

Buildt.ai
Buildt.ai

AI驱动的软件开发平台,可以自动生成代码片段、代码分析及其他自动化任务

下载
<tbody class="table-group-divider">
  <ng-container *ngFor="let refRaw of tableMongoData">
    <tr *ngFor="let rafale of refRaw.rafale">
      <th class="text-center" scope="row">{{ rafale.name }}</th>
      <!-- 仅当 rafale 自带 partQty 时才渲染,并应用其 rowspan -->
      <td
        *ngIf="rafale.partQty"
        [attr.rowspan]="rafale.rowspan"
        class="text-center align-middle"
        tabindex="0"
        data-html="true"
        data-bs-toggle="tooltip"
        data-bs-placement="top"
        data-bs-title="Referência: "
      >
        {{ rafale.partQty }}
      </td>
      <!-- 其余列(PB/PN/PA)保持不变 -->
      <td class="text-center">{{ rafale.refs.find(r => r.type === 'PB')?.partQty }}</td>
      <td class="text-center">{{ rafale.refs.find(r => r.type === 'PN')?.partQty }}</td>
      <td class="text-center">{{ rafale.refs.find(r => r.type === 'PA')?.partQty }}</td>
    </tr>
  </ng-container>
</tbody>

对应的数据结构调整如下(关键变化已加粗):

tableMongoData = [
  {
    ref: '322416730R',
    type: 'RAW',
    rafale: [
      {
        name: '14x63',
        **partQty: '1.467',   // ← 下沉至此
        **rowspan: 2,         // ← 下沉至此**
        refs: [ /* ... */ ]
      },
      {
        name: '14x69',
        // ← 无 partQty & rowspan,此行不渲染左侧数量列
        refs: [ /* ... */ ]
      }
    ]
  },
  // ...
];

⚠️ 注意事项:

  • *不要滥用 `ngIf+ 状态标记**:例如在组件类中维护renderedRefs: Set并在模板中*ngIf="!renderedRefs.has(refRaw.ref)"` —— 这会耦合模板与状态管理,破坏可预测性,且在变更检测中易引发异常。
  • trackBy 不解决此问题:trackBy 仅优化 DOM 复用性能,不影响渲染逻辑或内容重复。
  • 服务端预处理更优:若数据来自 API,建议在 service 层完成 partQty 的下推逻辑(如 mapRafaleWithParentQty()),而非在模板或组件中做运行时判断。
  • CSS 替代方案慎用:虽可用 visibility: hidden 或 display: none 隐藏重复单元格,但这违反语义化 HTML 原则,影响可访问性(screen reader)及打印样式。

总结:Angular 模板的本质是数据驱动的声明式视图。当渲染逻辑变得“需要记忆历史”或“依赖执行顺序”时,往往意味着数据模型与 UI 需求存在错位。优先重构数据(denormalize for view),远胜于在模板中编写防御性逻辑。此举不仅修复 rowspan 问题,更提升代码可读性、可测试性与长期可维护性。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

550

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

30

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

45

2026.01.06

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

4396

2024.08.14

抖漫入口地址合集
抖漫入口地址合集

本专题整合了抖漫入口地址相关合集,阅读专题下面的文章了解更多详细地址。

3

2026.03.17

多环境下的 Nginx 安装、结构与运维实战
多环境下的 Nginx 安装、结构与运维实战

本专题聚焦多环境下Nginx实战,详解开发、测试及生产环境的差异化安装策略与目录结构规划。深入剖析配置模块化设计、灰度发布流程及跨环境同步机制。结合监控告警、故障排查与自动化运维工具,提供全链路管理方案,助力团队构建灵活、高可用的Nginx服务体系,从容应对复杂业务场景挑战。

0

2026.03.17

PS 批量添加图片
PS 批量添加图片

本专题整合了PS批量添加图片教程合集,阅读专题下面的文章了解更多详细操作。

2

2026.03.17

Nginx 基础架构:从安装配置到系统化管理
Nginx 基础架构:从安装配置到系统化管理

本专题深入解析Nginx基础架构,涵盖从源码编译与包管理安装,到核心配置文件优化及虚拟主机部署。进一步探讨日志轮转、性能调优、高可用集群构建及自动化运维策略,助力管理员实现从单一服务搭建到企业级系统化管理的全面升级,确保Web服务高效、稳定运行。

1

2026.03.17

mulerun骡子快跑入口地址汇总
mulerun骡子快跑入口地址汇总

本专题整合了mulerun入口地址合集,阅读专题下面的文章了解更多详细内容。

38

2026.03.17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号