UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载在 ng-zorro-antd 中nz-modal组件默认自带确定 / 取消页脚按钮但在真实业务中页脚往往需要承载异步提交、loading 状态、自定义文案乃至完全不同的按钮组合。本文以官方示例 components/modal/demo/footer.md 为骨架结合 components/modal/demo/footer.ts、components/modal/demo/footer2.ts 两个完整示例与 modal.component.ts、modal-footer.directive.ts 等源码实现系统讲解如何通过nzFooter输入属性与nzModalFooter指令自定义弹窗页脚并实现点击提交 → 进入 loading → 完成关闭的完整交互闭环。读完本文你将掌握三种页脚定制手段模板引用、指令标记、配置对象数组、隐藏默认按钮的方法以及背后的配置更新机制。一、示例要解决的核心问题默认情况下nz-modal会渲染一对确定 / 取消按钮。示例 footer.md 描述了一个更复杂的场景自定义页脚的按钮栏不再使用默认的确定取消按钮点击提交按钮后弹窗进入loading 状态按钮转圈、防重复提交loading 结束后弹窗自动关闭如果完全不需要默认页脚按钮可将nzFooter设为null。这是一个典型的异步表单提交弹窗交互用户确认 → 请求进行中 → 结果落地后关闭。官方演示代码位于 footer.ts其中通过两个 Angularsignal分别管理弹窗可见性与按钮 loading 状态readonly isVisible signal(false); readonly isConfirmLoading signal(false);提交回调handleOk先置 loading 为true模拟 1 秒异步操作后同时复位可见性与 loadinghandleOk(): void { this.isConfirmLoading.set(true); setTimeout(() { this.isVisible.set(false); this.isConfirmLoading.set(false); }, 1000); }二、方案一通过 nzFooter 传入模板引用footer.ts示例 footer.ts 采用模板引用变量 属性绑定的方式。先在nz-modal内部用ng-template声明页脚模板再通过[nzFooter]modalFooter把它绑定给弹窗nz-modal [(nzVisible)]isVisible [nzTitle]modalTitle [nzContent]modalContent [nzFooter]modalFooter (nzOnCancel)handleCancel() ng-template #modalTitleCustom Modal Title/ng-template ng-template #modalContent pModal Content/p pModal Content/p pModal Content/p pModal Content/p pModal Content/p /ng-template ng-template #modalFooter spanModal Footer:/span button nz-button nzTypedefault (click)handleCancel()Custom Callback/button button nz-button nzTypeprimary (click)handleOk() [nzLoading]isConfirmLoading()Custom Submit/button /ng-template /nz-modal关键交互拆解页脚内放两个nz-button普通按钮触发handleCancel直接关闭主按钮nzTypeprimary触发handleOk执行提交主按钮通过[nzLoading]isConfirmLoading()绑定 loading 状态点击后按钮进入加载转圈期间可有效防止重复点击loading 结束本示例为 1 秒setTimeout实际应替换为真实接口请求后将isVisible置为false弹窗关闭同时复位isConfirmLoading。需要注意的是该示例的#modalFooter、#modalTitle、#modalContent三个模板分别对应nzFooter、nzTitle、nzContent三个输入属性形成模板引用变量即配置来源的统一写法页面结构一目了然。三、方案二使用 nzModalFooter 指令footer2.ts除了属性绑定ng-zorro-antd 还提供结构型指令nzModalFooter直接在弹窗内容里标记页脚区块。示例 footer2.ts 同时展示了它在模板内与组件内两种场景的用法。3.1 在模板中使用*nzModalFooter与nzModalContent、nzModalTitle指令类似nzModalFooter可以直接包裹自定义页脚 DOMnz-modal [(nzVisible)]isVisible nzTitleCustom Modal Title (nzOnCancel)handleCancel() div *nzModalContent pModal Content/p pModal Content/p pModal Content/p pModal Content/p pModal Content/p /div div *nzModalFooter spanModal Footer:/span button nz-button nzTypedefault (click)handleCancel()Custom Callback/button button nz-button nzTypeprimary (click)handleOk() [nzLoading]isConfirmLoading()Custom Submit/button /div /nz-modal相比模板引用变量这种写法更贴近内容即配置的声明式风格页脚直接写在弹窗组件体内不需要额外维护#modalFooter变量。3.2 通过 NzModalService 在组件中自定义页脚示例还演示了指令在组件化页脚中的威力。当使用NzModalService.create命令式创建弹窗时nzContent可以传入一个组件类而该组件内部同样可以声明*nzModalFootershowModal2(): void { this.modalService.create({ nzTitle: Modal Title, nzContent: NzModalCustomFooterComponent }); }被注入的页脚组件自身定义内容与页脚并通过注入的NzModalRef直接销毁弹窗Component({ selector: nz-modal-custom-footer-component, template: div pModal Content/p pModal Content/p pModal Content/p pModal Content/p pModal Content/p /div div *nzModalFooter button nz-button nzTypedefault (click)destroyModal()Custom Callback/button button nz-button nzTypeprimary (click)destroyModal()Custom Submit/button /div }) export class NzModalCustomFooterComponent { private readonly modalRef inject(NzModalRef); destroyModal(): void { this.modalRef.destroy(); } }这种模式的价值在于把弹窗内容与页脚封装进一个独立组件页脚按钮的点击逻辑如表单校验、接口提交、关闭弹窗都可以直接写在组件内通过NzModalRef的destroy()方法控制弹窗生命周期非常适合中大型业务模块复用。3.3 指令的底层实现modal-footer.directive.ts 完整揭示了nzModalFooter的工作原理指令在构造时注入自身的TemplateRef并可选注入NzModalRef然后调用updateConfig把模板写入弹窗配置Directive({ selector: [nzModalFooter], exportAs: nzModalFooter }) export class NzModalFooterDirective { public readonly templateRef: TemplateRef{} inject(TemplateRef); private nzModalRef inject(NzModalRef, { optional: true }); constructor() { this.nzModalRef?.updateConfig({ nzFooter: this.templateRef }); } }可以看到页脚指令本质上是nzFooter配置项的模板化语法糖无论*nzModalFooter写在模板内还是命令式创建的组件内最终都会汇入nzFooter属性参与弹窗渲染。四、隐藏默认按钮nzFooter 置为 null官方文档 footer.md 特别强调不需要默认确定取消按钮时把nzFooter设为null。nz-modal [(nzVisible)]isVisible [nzFooter]null !-- 无任何默认按钮 -- /nz-modal在 modal.component.ts 中nzFooter的输入类型被定义为Input() nzFooter?: string | TemplateRef{} | ArrayModalButtonOptionsT | null;从源码类型可以看出nzFooter支持四种取值取值行为string渲染为纯文本页脚内容TemplateRef{}渲染自定义模板方案一、方案二的基础ArrayModalButtonOptionsT按配置对象数组渲染按钮见下节null完全隐藏默认页脚按钮另外注意文档参数表中明确说明当普通模式下使用了nzFooter参数nzOkText、nzCancelText等按钮文字配置将不再生效见 components/modal/doc/index.zh-CN.md即自定义页脚会整体接管底部区域默认按钮体系被替换。五、进阶用 ModalButtonOptions 数组配置页脚按钮若不想手写模板nzFooter还支持传入ModalButtonOptions配置对象数组由框架自动生成按钮。该接口定义在 modal-types.ts官方文档 components/modal/doc/index.zh-CN.md 给出完整字段说明nzFooter: [{ label: string; // 按钮文本 type?: string; // 类型与 nz-button 一致如 primary / default danger?: boolean; // 是否 danger shape?: string; // 形状 ghost?: boolean; // 是否 ghost size?: string; // 大小 autoLoading?: boolean; // 默认为 trueonClick 返回 Promise 时该按钮自动进入 loading // 以下方法的 this 指向该配置对象自身当 nzContent 为组件类时 // contentComponentInstance 参数为该组件类的实例 show?: boolean | ((this: ModalButtonOptions, contentComponentInstance?: object) boolean); loading?: boolean | ((this: ModalButtonOptions, contentComponentInstance?: object) boolean); disabled?: boolean | ((this: ModalButtonOptions, contentComponentInstance?: object) boolean); onClick?(this: ModalButtonOptions, contentComponentInstance?: object): void | Promisevoid | any; }]几个值得注意的行为细节来源于 modal-types.ts 源码注释与官方文档autoLoading默认true只要onClick返回 Promise按钮就会自动进入 loading直到 Promise 落定这恰好对应示例中点击提交后进入 loading 状态的需求且无需手动维护 loading signalloading与autoLoadingtrue不能同时使用源码注释明确标注show、loading、disabled均支持函数形式可依据内容组件实例动态计算按钮状态所有配置项可在运行态实时修改框架会触发按钮行为改变适合根据表单校验结果动态启停按钮。六、源码视角页脚模板的注入与热更新在 modal.component.ts 中NzModalComponent通过ContentChild(NzModalFooterDirective)捕获指令模板并在 setter 中写入nzFooterContentChild(NzModalFooterDirective, { static: true, read: TemplateRef }) set modalFooter(value: TemplateRefNzSafeAny) { if (value) { this.setFooterWithTemplate(value); } } private setFooterWithTemplate(templateRef: TemplateRef{}): void { this.nzFooter templateRef; if (this.modalRef) { // 若 modalRef 已创建在下一 tick 更新配置 Promise.resolve().then(() { this.modalRef!.updateConfig({ nzFooter: this.nzFooter }); }); } this.cdr.markForCheck(); }这一实现同时支持两种注入时机弹窗尚未创建nzFooter直接写入组件配置弹窗首次打开即携带自定义页脚弹窗已经创建通过Promise.resolve().then()在下一事件循环调用modalRef.updateConfig热更新页脚并调用markForCheck触发变更检测保证页脚模板渲染与状态同步。结合 modal.component.ts 的getConfig()可以确认所有输入属性通过getConfigFromComponent(this)汇集成ModalOptions交给NzModalService.create渲染因此属性绑定、指令标记、服务配置三条路径最终殊途同归。七、三种方案选型建议方案适用场景优点缺点[nzFooter]modalFooter模板引用页脚与弹窗模板写在一起、逻辑集中在宿主组件结构直观、可与标题/内容模板统一管理逻辑较复杂时宿主组件会膨胀*nzModalFooter指令模板内声明式标记页脚紧邻内容写法简洁、贴近内容即配置交互逻辑仍需宿主组件承载*nzModalFooter指令组件内 Service命令式弹窗、页脚逻辑内聚、需复用组件自治、可用NzModalRef直接控制生命周期需额外维护组件类nzFooter: ModalButtonOptions[]纯按钮组合、无复杂 DOM 需求零模板、支持自动 loading 与函数式动态状态定制自由度低于完全自定义模板八、总结弹窗页脚定制是 ng-zorro-antd Modal 最常用的扩展点之一。本文基于官方示例 footer.md 完整还原了自定义按钮 loading 提交 完成后关闭的交互流程并延伸到指令用法、nzFooter null隐藏默认按钮、ModalButtonOptions配置数组以及底层模板注入机制。实际项目中你只需记住三条主线要整体替换默认按钮使用[nzFooter]模板引用或*nzModalFooter指令完全不要底部按钮将nzFooter设为null需要框架级 loading 与函数式状态直接用ModalButtonOptions[]autoLoading会在onClick返回 Promise 时自动处理加载态。结合 modal-footer.directive.ts 与 modal.component.ts 的源码阅读你便能从会用进阶到懂原理在复杂业务场景中自如选择最合适的页脚方案。赞分享UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载相关推荐NG-ZORRO/ng-zorro-antd 主题定制完全指南NG ZORRO/ng zorro antd 主题定制完全指南 前言 NG ZORROAnt Design of Angular作为企业级UI组件库提供了UI组件前端ng-zorro-antd Grid 栅格 nzFlex 属性完全指南从 Flex 填充到弹性布局实战ng zorro antd Grid 栅格 nzFlex 属性完全指南从 Flex 填充到弹性布局实战 nz col 提供的 nzFlex 属性是 ng zoUI组件前端ng-zorro-antd Modal 弹窗组件完全指南声明式与命令式双模式 API 深度解析ng zorro antd Modal 弹窗组件完全指南声明式与命令式双模式 API 深度解析 本文基于 ng zorro antd 仓库的官方 ModalUI组件前端上一篇Desktop Postflop免费开源德州扑克GTO求解器终极指南下一篇StreamFX终极指南如何用免费OBS插件打造专业级直播画面创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
VSCode离线配置ESP32开发环境:ESP-IDF多版本共存与新项目向导实战 1. 为什么这个教程值得你花30分钟认真读完VSCODE安装ESP32开发环境,表面看只是点几下鼠标、敲几行命令的事,但实际踩过的坑,足够让一个有C语言基础的工程师在头三天反复重启电脑、重装系统、怀疑人生。我带过6个应届生做物联网毕设࿰… · 2026/9/27 10:33:11
ESP32-CAM图像传输实战:硬件接线、源码与踩坑全解析 1. 项目概述:为什么ESP32-CAM图像传输值得你花三小时认真读完我第一次把ESP32-CAM连上电脑,看到串口监视器里跳出“Camera init failed”时,手里的杜邦线差点被捏断。那会儿网上搜“ESP32-CAM 图像传输”,前五页全是复制粘贴的Ard… · 2026/9/27 10:32:46
避开建站报价陷阱:网站建设的课件如何选 避开建站报价陷阱:网站建设的课件如何选 域名服务器搞不懂,是不是你最大的心病?很多老板拿着预算找供应商,对方张嘴就是“建站报价”几千到几万不等,但你心里没底:这钱花得值不值?技术到底行不行?… · 2026/9/27 11:19:44
STM32开发资源全景指南:从入门到实战,避开资料陷阱 说实话,每年都有大量新人被 STM32 的“资料海”淹没。我当年入门时,手里攥着一块最小系统板,浏览器里存了几十个网址,结果一半是过时的教程,一半是付费课程的引流页,真正能解决“定时器为什么进不了中断”“… · 2026/9/27 11:19:38
网站推广入口速查手册:5步打通流量任督二脉 网站推广入口速查手册:5步打通流量任督二脉 自己不会代码想做网站,是不是光看教程就头晕?别慌,这份速查手册专治各种“找不到入口”的焦虑。很多站长卡壳,不是因为技术难,而是压根不知道去哪点。… · 2026/9/27 11:19:25
电控秋招没回音?10个开源项目补齐工程经历 有些事情真的很气人:邮箱里躺着已读不回的礼貌自动回复,招聘网站上状态栏永远是“已筛选”,你花了一晚上改完的简历,像石沉大海。对绝大多数准备秋招做电控方向的同学来说,真正的问题未必是学校或绩点不够,… · 2026/9/27 11:19:13
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01