ng-zorro-antd 表格动态控制(Table Dynamic Settings)实战:用 Form 表单实时切换全部表格属性
UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载本文以 ng-zorro-antd 官方演示Dynamic Settings动态控制表格属性为核心完整拆解其表单配置面板 响应式表格渲染的实现方案。演示位于 components/table/demo/dynamic-settings.md说明文档与 components/table/demo/dynamic-settings.ts源码实现读者读完可以掌握如何通过ReactiveFormsModule的FormGroup与 Angular signals 驱动nz-table的十余个输入属性在运行期实时切换边框、分页、固定列、表头、加载态、尺寸等配置并独立复刻出这一配置组合预览器。一、演示主题选择不同配置组合查看效果官方对该演示的定位非常精炼中文说明为选择不同配置组合查看效果英文为Select different settings to see the result。虽然说明只有一句话但其背后的实现承载了nz-table绝大多数可动态调节的属性外观类bordered边框、size表格尺寸、loading加载态结构类title标题、header列头、footer表尾、expandable展开行数据类pagination前端分页开关、sizeChanger每页条数切换器、simple简单分页、position分页位置、paginationType分页尺寸交互类checkbox行多选、ellipsis单元格省略、fixHeader固定表头、tableScroll横向/固定滚动与固定列。整个演示可以看作一个表格属性实验台左侧上方是一排开关与单选组右侧下方是实时响应这些设置的表格。下面从源码逐层还原其实现。二、配置面板的骨架Setting 接口与表单初始化演示把所有可配置项收敛进一个强类型接口Setting定义见 components/table/demo/dynamic-settings.tstype TableScroll unset | scroll | fixed; interface Setting { bordered: boolean; loading: boolean; pagination: boolean; sizeChanger: boolean; title: boolean; header: boolean; footer: boolean; expandable: boolean; checkbox: boolean; fixHeader: boolean; noResult: boolean; ellipsis: boolean; simple: boolean; size: NzTableSize; tableScroll: TableScroll; tableLayout: NzTableLayout; position: NzTablePaginationPosition; paginationType: NzTablePaginationType; }这些枚举类型全部来自组件自身的类型定义 components/table/src/table.types.tsexport type NzTableLayout fixed | auto; export type NzTablePaginationPosition top | bottom | both; export type NzTablePaginationType default | small; export type NzTableSize middle | default | small;也就是说表格尺寸只有middle / default / small三种分页位置可选top / bottom / both分页类型仅default / small表格布局仅fixed / auto。配置面板中Size、Pagination Position、Pagination Type、Table Layout四组单选的可选值正是这些类型的字面量全集。表单通过NonNullableFormBuilder构造并为每个控件给出演示用的默认值源码第 155-174 行readonly settingForm: FormGroup{ [K in keyof Setting]: FormControlSetting[K] } this.formBuilder.group({ bordered: [false], loading: [false], pagination: [true], sizeChanger: [false], title: [true], header: [true], footer: [true], expandable: [true], checkbox: [true], fixHeader: [false], noResult: [false], ellipsis: [false], simple: [false], size: small as NzTableSize, paginationType: default as NzTablePaginationType, tableScroll: unset as TableScroll, tableLayout: auto as NzTableLayout, position: bottom as NzTablePaginationPosition });三、面板 UI开关组与单选组的声明式渲染面板模板使用for循环统一渲染两组控件源码第 54-77 行listOfSwitch13 个nz-switch每个开关绑定一个布尔型formControlName例如Bordered、Loading、Pagination、PageSizeChanger、Title、Column Header、Footer、Expandable、Checkbox、Fixed Header、No Result、Ellipsis、Simple PaginationlistOfRadio5 组nz-radio-group按钮样式nz-radio-button对应Size、Table Scroll、Table Layout、Pagination Position、Pagination Type。form nz-form nzLayoutinline [formGroup]settingForm for (item of listOfSwitch; track item) { nz-form-item nz-form-label{{ item.name }}/nz-form-label nz-form-control nz-switch [formControlName]item.formControlName / /nz-form-control /nz-form-item } for (radio of listOfRadio; track radio) { nz-form-item nz-form-label{{ radio.name }}/nz-form-label nz-form-control nz-radio-group [formControlName]radio.formControlName for (o of radio.listOfOption; track o) { label nz-radio-button [nzValue]o.value{{ o.label }}/label } /nz-radio-group /nz-form-control /nz-form-item } /form这种配置元数据数组的做法把 13 个开关、5 组单选收敛成两份纯数据模板零重复新增配置项只需往数组里加一条记录——这是本演示最值得借鉴的工程模式。四、表格模板nz-table 输入属性与单元格增强语法表格部分源码第 78-143 行把settingForm的当前值经settingValue()signal 逐项绑定到nz-tablenz-table #dynamicTable [nzScroll]{ x: scrollX(), y: scrollY() } [nzData]listOfData() [nzTableLayout]settingValue().tableLayout [nzBordered]settingValue().bordered [nzSimple]settingValue().simple [nzLoading]settingValue().loading [nzPaginationType]settingValue().paginationType [nzPaginationPosition]settingValue().position [nzShowSizeChanger]settingValue().sizeChanger [nzFrontPagination]settingValue().pagination [nzShowPagination]settingValue().pagination [nzFooter]settingValue().footer ? Here is Footer : null [nzTitle]settingValue().title ? Here is Title : null [nzSize]settingValue().size (nzCurrentPageDataChange)currentPageDataChange($event) 各输入属性在官方 API 文档 components/table/doc/index.zh-CN.md 与 components/table/doc/index.en-US.md 中有完整定义与本演示的对应关系如下演示控件nz-table 属性类型默认值说明Bordered[nzBordered]booleanfalse是否展示外边框和列边框Loading[nzLoading]booleanfalse页面是否加载中可配nzLoadingDelay防闪烁Pagination[nzFrontPagination]/[nzShowPagination]booleantrue/true是否前端分页、是否显示分页器PageSizeChanger[nzShowSizeChanger]booleanfalse是否可以改变nzPageSize选项默认[10, 20, 30, 40]Title[nzTitle]string \| TemplateRefvoid-表格标题Footer[nzFooter]string \| TemplateRefvoid-表格尾部Fixed Header[nzScroll].yobject-纵向滚动即固定表头No Result[nzData]置空T[]-无数据时展示空状态Ellipsis[nzEllipsis]th/tdbooleanfalse单元格内容省略仅在nzTableLayout fixed时生效Simple Pagination[nzSimple]boolean-简单分页Size[nzSize]middle \| small \| defaultdefault表格尺寸Table Layout[nzTableLayout]fixed \| autoauto表格布局fixed是nzEllipsis生效的前提Pagination Position[nzPaginationPosition]top \| bottom \| bothbottom分页显示位置Pagination Type[nzPaginationType]default \| smalldefault分页尺寸注意[nzTitle]与[nzFooter]的写法settingValue().title ? Here is Title : null即传入null时关闭对应区域传入字符串时渲染文本二者也支持TemplateRef自定义复杂内容。单元格层面用到了三组增强指令演示第 96-142 行固定列[nzLeft]fixedColumn()左侧固定列与[nzRight]fixedColumn()右侧固定 Action 列fixedColumn()为boolean时由组件自动计算像素宽度展开行td [(nzExpand)]data.expand双向绑定展开状态配合tr [nzExpand]data.expand渲染展开内容行多选表头[nzChecked]allChecked()、[nzIndeterminate]indeterminate()与(nzCheckedChange)checkAll($event)行单元格[(nzChecked)]data.checked双向绑定。五、数据与选择状态管理signals 当前页数据回填演示用 Angular 16 的 signal 承载全部运行期状态源码第 175-182 行readonly listOfData signalreadonly ItemData[]([]); // 全量数据 readonly displayData signalreadonly ItemData[]([]); // 当前页数据 readonly allChecked signal(false); // 表头全选状态 readonly indeterminate signal(false); // 半选状态 readonly fixedColumn signal(false); // 是否固定首尾列 readonly scrollX signalstring | null(null); // 横向滚动宽度 readonly scrollY signalstring | null(null); // 纵向滚动高度 readonly settingValue signal(this.settingForm.value as Setting); // 配置快照关键联动是(nzCurrentPageDataChange)事件表格当前页数据变化时写回displayData并刷新勾选状态源码第 244-255 行currentPageDataChange($event: readonly ItemData[]): void { this.displayData.set($event); this.refreshStatus(); } refreshStatus(): void { const validData this.displayData().filter(value !value.disabled); const allChecked validData.length 0 validData.every(value value.checked); const allUnChecked validData.every(value !value.checked); this.allChecked.set(allChecked); this.indeterminate.set(!allChecked !allUnChecked); }全选/取消全选只作用于当前页displayData并跳过disabled行这是分页表格多选的正确姿势——避免跨页误操作indeterminate半选状态在部分选中且部分未选时为truecheckAll(value: boolean): void { this.displayData().forEach(data { if (!data.disabled) { data.checked value; } }); this.refreshStatus(); }测试数据由generateData()生成 100 条记录源码第 266-280 行字段覆盖演示所需checked勾选、expand展开、description展开内容、age/address普通单元格Address 用于验证nzEllipsis省略效果。六、联动订阅tableScroll、fixHeader 与 noResult 的副作用演示最具动态精髓的是三个valueChanges订阅源码第 282-301 行它们把表单控件的变化翻译成表格的具体行为ngOnInit(): void { // 1. 全量配置快照任何表单变化都刷新 settingValue this.settingForm.valueChanges.subscribe(value { this.settingValue.set(value as Setting); }); // 2. Table Scroll 三态联动unset / scroll / fixed this.settingForm.controls.tableScroll.valueChanges.subscribe(scroll { this.fixedColumn.set(scroll fixed); // fixed 时固定左右列 this.scrollX.set(scroll scroll || scroll fixed ? 100vw : null); // 横向滚动 }); // 3. Fixed Header开启后给表格纵向滚动高度 240px即固定表头 this.settingForm.controls.fixHeader.valueChanges.subscribe(fixed { this.scrollY.set(fixed ? 240px : null); }); // 4. No Result清空/恢复数据以演示空状态 this.settingForm.controls.noResult.valueChanges.subscribe(empty { if (empty) { this.listOfData.set([]); } else { this.listOfData.set(this.generateData()); } }); this.listOfData.set(this.generateData()); }其中第 2 处值得展开Table Scroll单选有Unset / Scroll / Fixed三档——scroll仅开启横向滚动nzScroll.x 100vwfixed在横向滚动基础上再通过[nzLeft]/[nzRight]固定 Name 列与 Action 列形成横向滚动 首尾固定列的经典复杂表格布局而nzScroll.y 240px固定表头则被独立成Fixed Header开关二者互不干扰、可自由组合。另外注意settingForm的泛型写法FormGroup{ [K in keyof Setting]: FormControlSetting[K] }——它利用映射类型让每个控件的类型与Setting字段严格对齐是 TypeScript 强类型表单的模板级示范NonNullableFormBuilder保证默认值非空。七、性能与变更检测提示官方文档 components/table/doc/index.en-US.md 的 Note 一节专门提醒NG-ZORRO 组件全部运行在 OnPush 变更检测策略下直接修改传入Input()的数组/对象不会触发视图更新应使用不可变方式更新数据演示中正是依赖signal.set()与for ... track data.id保证引用变更可被检测// 新增数据使用展开运算符生成新数组 this.dataSet [...this.dataSet, newItem]; // 删除数据使用 filter 生成新数组 this.dataSet this.dataSet.filter(d d.key ! key);八、如何在本仓库中复现与继续研究演示说明查看 components/table/demo/dynamic-settings.md完整实现阅读 components/table/demo/dynamic-settings.ts其中组件依赖ReactiveFormsModule、NzFormModule、NzRadioModule、NzSwitchModule、NzDividerModule与NzTableModule引入这些模块后即可在任意页面复刻类型定义NzTableSize、NzTableLayout、NzTablePaginationPosition、NzTablePaginationType等枚举见 components/table/src/table.types.tsAPI 全表nz-table、th、td、thead、tr、tfoot的全部输入输出属性见 components/table/doc/index.zh-CN.md 与 components/table/doc/index.en-US.md组件核心实现nz-table主体位于components/table/src/table/目录含table.component.ts、table-inner-default.component.ts等table-data.service.ts负责分页/排序/筛选的数据加工管线是理解前端分页nzFrontPagination底层机制的最佳入口。小结Dynamic Settings演示虽小却是理解nz-table输入属性的活字典一份Setting接口、一份表单、两份配置元数据数组、四条valueChanges订阅就串起了边框、加载、分页、尺寸、布局、滚动、固定列/表头、展开行、多选、省略、空状态等几乎全部核心能力。把它的配置元数据 强类型表单 signal 快照模式迁移到自己的业务中即可低成本打造表格设置中心或调试面板快速验证任意属性组合下的表现。赞分享UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载相关推荐ng-zorro-antd Table 可控排序与筛选用 [nzSortOrder] / [nzFilters] 编程式控制表格状态ng zorro antd Table 可控排序与筛选用 nzSortOrder / nzFilters 编程式控制表格状态 本篇指南聚焦 ng zorroUI组件前端ant-design Table 动态配置实战基于 Dynamic Settings 示例实现可交互的表格属性控制面板ant design Table 动态配置实战基于 Dynamic Settings 示例实现可交互的表格属性控制面板 导读 本文以 ant design 仓前端UI组件设计系统ng-zorro-antd 表格嵌套子表格Nested Table实战指南用 nzExpand 展开行展示每行详情ng zorro antd 表格嵌套子表格Nested Table实战指南用 nzExpand 展开行展示每行详情 嵌套子表格Nested tablesUI组件前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Model-Optimizer:大模型推理全栈优化工程实践

Model-Optimizer:大模型推理全栈优化工程实践

1. “Model-Optimizer”不是工具名,而是工程目标的精准表达很多人第一次看到“Model-Optimizer”这个标题,下意识会以为是个开源项目、某个GitHub仓库名,或者某家公司的商业化产品。我最初也这么想,直到连续三天在NVIDIA开发者论坛…

2026/9/29 8:03:40 阅读更多 →
让AI在你睡觉时工作:Cabinet定时任务Cron调度与Heartbeat实战指南

让AI在你睡觉时工作:Cabinet定时任务Cron调度与Heartbeat实战指南

让AI在你睡觉时工作:Cabinet定时任务Cron调度与Heartbeat实战指南 【免费下载链接】cabinet AI-first knowledge base and startup OS 项目地址: https://gitcode.com/gh_mirrors/cabinet3/cabinet 🗄️ Cabinet 是一款开源的 AI-first 知识库与创…

2026/9/29 8:03:40 阅读更多 →
Linux——socket网络编程

Linux——socket网络编程

一、主机字节序列和网络字节序列(一)主机字节序CPU在内存中进行数据存取的顺序。二进制存在高位和低位之分:左边是高位,右边是低位;内存存储存在高地址和低地址之分:一块空间起始处总是低地址(一…

2026/9/29 8:03:39 阅读更多 →

最新新闻

MFC HTTP文件上传实战:WinINet、multipart与工作线程详解

MFC HTTP文件上传实战:WinINet、multipart与工作线程详解

简介:MFC框架下实现HTTP/HTTPS上传的完整示例工程,面向需要基于WinInet进行网络文件传输的C开发人员,重点解决文件选择、服务器地址配置和上传进度展示等界面与协议衔接问题。压缩包共49个文件,以头文件(h)…

2026/9/29 8:45:32 阅读更多 →
ArkWeb 升到 Chromium 144,页面能打开不代表适配完成:把 100+ 差异变成发布门禁

ArkWeb 升到 Chromium 144,页面能打开不代表适配完成:把 100+ 差异变成发布门禁

ArkWeb 升到 Chromium 144,页面能打开不代表适配完成:把 100 差异变成发布门禁 混合应用升级后,首页和登录页都能打开,团队便判定 ArkWeb 适配完成。上线前才发现文件上传、跨域跳转和原生桥接各有一条边界失败。内核从 132 升到…

2026/9/29 8:45:32 阅读更多 →
Linux Gstreamer深度解析之gst_audio_decoder_set_needs_format调用流程与实战(四十六)

Linux Gstreamer深度解析之gst_audio_decoder_set_needs_format调用流程与实战(四十六)

简介: CSDN博客专家、《Android系统多媒体进阶实战》作者 博主新书推荐:《Android系统多媒体进阶实战》🚀 Android Audio工程师专栏地址: Audio工程师进阶系列【原创干货持续更新中……】🚀 Android多媒体专栏地址&a…

2026/9/29 8:45:32 阅读更多 →
电子政务云费用计算指南:从账单治理到资源治理实战

电子政务云费用计算指南:从账单治理到资源治理实战

简介:这份PDF指南是《电子政务云平台服务费用计算参考指南(第一版)》的电子版,面向各级电子政务云平台使用、管理、建设和运维机构,为服务费用预算、审核、计取和支付提供统一参考。资源共1个PDF文件,体积仅…

2026/9/29 8:45:32 阅读更多 →
高校千兆宿舍网全栈设计:三层架构+子网嵌套+施工级落地指南

高校千兆宿舍网全栈设计:三层架构+子网嵌套+施工级落地指南

简介:本资源是一份面向计算机科学与技术专业本科生的《计算机网络》课程设计实践文档,聚焦宿舍局域网的完整规划与落地实现,解决真实场景中多用户接入、出口带宽分配、安全管控与可扩展性等典型工程问题。文档为单文件PDF,共1个64…

2026/9/29 8:45:32 阅读更多 →
Trae记忆功能实操避坑:目录修改+记忆导入导出+TaoToken配置骨架一次讲透

Trae记忆功能实操避坑:目录修改+记忆导入导出+TaoToken配置骨架一次讲透

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/29 8:44:32 阅读更多 →

日新闻

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

开源模型端侧落地实战:量化、推理加速与Agent上下文管理

1. 从"追平"到"端侧落地":开源模型这波到底变了什么如果你最近半年一直在关注模型圈的动态,应该能明显感觉到一个拐点:开源模型和闭源旗舰之间的差距,正在从"代差"变成"身位差"。以前大家…

2026/9/29 0:00:05 阅读更多 →
AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:00:05 阅读更多 →
Java采购管理系统实战:从数据库设计到事务一致性

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 0:00:05 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 9:47:26 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/28 16:55:15 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →