ng-zorro-antd Cascader 搜索功能实战:从 nzShowSearch 到自定义 filter/sorter

发布时间:2026/9/25 3:52:43

ng-zorro-antd Cascader 搜索功能实战:从 nzShowSearch 到自定义 filter/sorter UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载导读本文围绕 ng-zorro-antd 级联选择组件Cascader的搜索能力展开讲解如何通过nzShowSearch一行配置开启输入即搜、直接选中的搜索模式并结合仓库源码剖析搜索模式下的过滤、排序、高亮与选中闭环。读完本文你将掌握 Cascader 搜索的基本用法、自定义过滤与排序函数NzShowSearchOptions的完整写法以及搜索模式在底层是如何切换数据列columns的。一、功能概述为什么需要给 Cascader 加搜索Cascader 适用于从一组相关联的数据集合中进行选择的场景如省市区、公司层级、事物分类见 组件文档。当层级较深、选项较多时逐级点开菜单查找目标选项成本很高。搜索模式允许用户直接在输入框中键入关键字命中的叶子节点路径会被扁平化展示在单列结果中点选即可完成整条路径的选择。对应的演示文档 search.md 描述即为可以直接搜索选项并选择 / Search and select an option directly。完整示例代码位于 search.ts。二、最小可用示例开启搜索并选中在nz-cascader上增加[nzShowSearch]true即可开启搜索import { Component } from angular/core; import { FormsModule } from angular/forms; import { NzCascaderModule, NzCascaderOption } from ng-zorro-antd/cascader; const options: NzCascaderOption[] [ { value: zhejiang, label: Zhejiang, children: [ { value: hangzhou, label: Hangzhou, children: [ { value: xihu, label: West Lake, isLeaf: true } ] }, { value: ningbo, label: Ningbo, isLeaf: true, disabled: true } ] }, { value: jiangsu, label: Jiangsu, children: [ { value: nanjing, label: Nanjing, children: [ { value: zhonghuamen, label: Zhong Hua Men, isLeaf: true } ] } ] } ]; Component({ selector: nz-demo-cascader-search, imports: [FormsModule, NzCascaderModule], template: nz-cascader [nzOptions]nzOptions [(ngModel)]values [nzShowSearch]true (ngModelChange)onChanges($event) / }) export class NzDemoCascaderSearchComponent { readonly nzOptions: NzCascaderOption[] options; values: string[] | null null; onChanges(values: string[]): void { console.log(values, this.values); } }要点说明数据源使用NzCascaderOption[]叶子节点通过isLeaf: true标记非叶子节点通过children展开下一级类型定义见 typings.ts。values的类型为string[]即一条完整路径的值数组例如选择West Lake后得到[zhejiang, hangzhou, xihu]。示例中Ningbo被标记为disabled: true在普通浏览与搜索结果中均不可选——搜索模式下禁用状态会被继承传递见下文源码分析。事件绑定使用[(ngModel)](ngModelChange)与表单双向绑定体系完全兼容。三、核心 APInzShowSearch 的三种形态组件中nzShowSearch的输入定义位于 cascader.component.tsInput() nzShowSearch: boolean | NzShowSearchOptions false;默认值为false不显示搜索输入框。它接受布尔值或对象两种形态取值说明false关闭搜索默认true开启搜索使用默认的过滤与排序逻辑NzShowSearchOptions对象开启搜索并自定义filter/sorter函数对象形态的接口定义如下见 typings.tsexport type NzCascaderFilter (searchValue: string, path: NzCascaderOption[]) boolean; export type NzCascaderSorter (a: NzCascaderOption[], b: NzCascaderOption[], inputValue: string) number; export interface NzShowSearchOptions { filter?: NzCascaderFilter; sorter?: NzCascaderSorter; }对应组件文档中的参数表doc/index.zh-CN.md为参数说明类型默认值filter可选选择是否保留选项的过滤函数每级菜单的选项都会被匹配(inputValue: string, path: NzCascaderOption[]): boolean-sorter可选按照到每个最终选项的路径进行排序默认按照原始数据的顺序(a: NzCascaderOption[], b: NzCascaderOption[], inputValue: string): number-注意文档中明确说明nzShowSearch不能和nzLoadData同时使用——动态加载异步数据源与本地全量搜索在数据获取方式上冲突。默认 filter对整条路径做包含匹配当nzShowSearch为true时使用的是内置默认过滤函数。其实现位于 cascader.service.tsconst defaultFilter: NzCascaderFilter (i, p) p.some(o { const label this.getOptionLabel(o); return !!label label.indexOf(i) ! -1; });这里的p是从根到当前候选节点的完整路径数组因此默认行为是对路径上每一级的 label 做子串匹配——只要某一级的 label 包含搜索词该叶子节点就会作为结果保留。这也是文档所述每级菜单的选项都会被匹配的具体含义。getOptionLabel会读取nzLabelProperty指定的属性默认label因此自定义字段名时搜索同样生效。自定义 filter忽略大小写如果希望搜索时忽略大小写可传入自定义filter示例同样来自组件文档const filter: NzCascaderFilter (i, p) { return p.some(o { const label o.label; return !!label label.toLowerCase().indexOf(i.toLowerCase()) ! -1; }); };用法nz-cascader [nzOptions]nzOptions [(ngModel)]values [nzShowSearch]{ filter: filter } /filter返回true表示保留该选项返回false则过滤掉。由于它是纯函数你可以自由扩展例如按value匹配、支持模糊匹配、首字母匹配等。自定义 sorter控制结果排序搜索命中后默认按原始数据顺序展示结果。若希望按路径相关度排序传入sorterimport { NzCascaderOption, NzCascaderSorter } from ng-zorro-antd/cascader; const sorter: NzCascaderSorter (a, b, inputValue) { // a、b 为两条命中路径inputValue 为当前搜索词 const scoreA a.some(o o.label?.startsWith(inputValue)) ? 0 : 1; const scoreB b.some(o o.label?.startsWith(inputValue)) ? 0 : 1; return scoreA - scoreB; // 前缀命中的路径排在前面 };sorter的返回值遵循Array.prototype.sort的语义负数表示a在前正数表示b在前。可以从搜索结果中提取输入关键字inputValue参数来设计加权策略例如前缀命中 中间命中 路径层级更浅。四、源码级原理搜索模式的完整闭环4.1 从输入到搜索模式的切换搜索模式由组件与服务共同维护。用户在输入框键入内容时inputValue的 setter 会触发toggleSearchingModecascader.component.tsset inputValue(inputValue: string) { this.inputString inputValue; this.toggleSearchingMode(!!inputValue); } private toggleSearchingMode(toSearching: boolean): void { if (this.inSearchingMode ! toSearching) { this.cascaderService.setSearchingMode(toSearching); } if (this.inSearchingMode) { this.cascaderService.prepareSearchOptions(this.inputValue); } }输入为空 → 退出搜索模式恢复级联列输入非空 → 进入搜索模式并即时调用prepareSearchOptions重新过滤。输入框本身复用 Select 组件的NzSelectSearchComponent模板见 cascader.component.ts支持 IME 组合输入isComposing与自动聚焦。4.2 列快照搜索不破坏原始级联状态进入搜索模式前服务会把当前级联列保存为快照cascader.service.tssetSearchingMode(toSearching: boolean): void { this.inSearchingMode toSearching; if (toSearching) { this.clearSearchOptions(); // 若搜索期间重置 nzOptions先清理缓存 this.columnSnapshot [...this.columns]; // 保存多列快照 this.activatedNodes []; } else { // 退出搜索恢复快照列并重建已选中路径的激活状态 ... } }这意味着搜索结果的展示是临时的搜索结束后组件会恢复原来的多列级联视图并重新激活已选中节点所在路径trackAncestorColumnData/trackAncestorActivatedNodes。4.3 过滤与单列结果prepareSearchOptionscascader.service.ts完成核心过滤逻辑递归遍历第一列的全部根节点loopParent处理非叶子、loopChild处理叶子对每个候选节点用filter(searchValue, path)判断是否命中命中则记录其路径命中节点的title会被临时改写为路径串如Zhejiang / Hangzhou / West Lake用于结果展示若有sorter按路径数组排序最后把结果压平为单列this.columns [results]并触发重绘。同时路径上任意节点的disabled状态会沿路径传递forceDisabled保证搜索结果中禁用路径的叶子同样不可选——这正是示例中Ningbo即使被搜索到也无法选中的原因。4.4 选中与退出搜索搜索模式下点击命中项时组件判断inSearchingMode后走搜索专用选中路径cascader.component.tsonOptionClick(node, columnIndex, event) { ... this.inSearchingMode ? this.cascaderService.setSearchOptionSelected(node, this.nzMultiple) : this.cascaderService.setNodeActivated(node, columnIndex, !this.nzMultiple); }setSearchOptionSelectedcascader.service.ts在完成选中后通过$quitSearching通知组件清空输入框、恢复下拉宽度样式并触发重绘——用户看到的直观效果是点选搜索结果后输入框立即清空、级联视图还原。另外两点与搜索强相关的实现细节空结果展示搜索无命中时下拉展示空态。setDropdownStylescascader.component.ts会依据搜索模式且无结果判断shouldShowEmpty并将下拉宽度对齐输入框宽度内容由nzNotFoundContent或nzEmbedEmpty兜底。搜索模式下的高亮渲染选项时NzCascaderOptionComponent接收[highlightText]inSearchingMode ? inputValue : cascader.component.ts即仅在搜索模式下对命中关键字做高亮展示普通级联浏览时不做高亮。键盘支持搜索模式下BACKSPACE、LEFT/RIGHT_ARROW保留输入框原生编辑能力cascader.component.tsENTER选中当前高亮结果UP/DOWN在结果间移动保证纯键盘可用。五、与其他选项的联动及注意事项场景结论多选模式nzMultiple与搜索可同时开启搜索命中项会进入多选标签列表选中后菜单保持展开源码中$nodeSelected订阅按!this.nzMultiple决定是否关闭菜单动态加载nzLoadData与nzShowSearch不可同时使用组件文档明确说明如需搜索大型远程数据可自行实现搜索接口 nzOptions重建自定义字段默认 filter 通过nzLabelProperty读取 label自定义字段名后搜索依然按真实 label 匹配表单状态搜索框外观与禁用nzDisabled、校验状态nzStatus、形态变体nzVariant完全继承 Cascader 主组件样式体系选中回调无论普通选中还是搜索选中都会统一走ngModelChange/nzSelectionChange业务无需区分来源六、小结Cascader 的搜索功能是级联浏览 扁平搜索两种交互的融合nzShowSearch一行开启内置 filter 对路径逐级匹配需要更精细的控制时NzShowSearchOptions的filter与sorter提供完全自定义的空间。底层实现上cascader.service.ts 通过列快照、路径映射与$quitSearching事件保证了搜索态与级联态的无缝切换且不破坏已选值与禁用规则。配合键盘导航、关键字高亮与空态兜底搜索模式让深层级联数据的选取体验大幅提升。赞分享UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载相关推荐PPT Master SVG图表模板指南33种图表3步做出可编辑PPTPPT Master SVG图表模板指南33种图表3步做出可编辑PPT PPT Master是一个AI驱动的演示文稿工具把文档变成可编辑的PPT。它自带3UI组件前端ng-zorro-antd Cascader 自定义校验状态nzStatus实战指南ng zorro antd Cascader 自定义校验状态nzStatus实战指南 nzStatus 是 ng zorro antd Cascader级UI组件前端ng-zorro-antd Cascader 响应式表单实战从表单绑定到 Reset 重置清空ng zorro antd Cascader 响应式表单实战从表单绑定到 Reset 重置清空 导读 本文以 ng zorro antd 组件库中 cascaUI组件前端上一篇gh_mirrors/exam/examples优化技术模型层融合策略下一篇揭秘gh_mirrors/v41/v4GatsbyReactMarkdown静态网站终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/25 3:47:43

ESP32上WASM为何不能直接调用硬件:架构设计与安全隔离

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

2026/9/25 4:37:45

Atlas 300V 24G AI加速卡部署YOLO推理实战与避坑指南

最近好几个朋友私信问我同一个问题:Atlas 300V 24G到底是不是运算加速卡?能不能拿来部署YOLO做实时检测?我一开始还纳闷,这不就是我们常见的那块昇腾推理卡嘛,后来才反应过来,市面上叫Atlas的东西太多了&am…

2026/9/25 4:37:45

higgsfield开源视频生成工具:扩散模型、时间注意力与LoRA微调实战

前几天在生成式AI的社区里刷到一个叫“higgsfield”的项目,这个名字很有意思,取的是粒子物理里那个著名的“希格斯场”——给基本粒子赋予质量的机制。做AI视频生成的人借用这个物理概念,确实很贴切,因为这类工具干的事情本质就是…

2026/9/25 4:37:45

业务AI嵌入服务全流程拆解:语义分割、智能体训练与落地周期

业务 AI 嵌入服务语义分割全流程拆解:智能体训练、流程编排、落地周期,保姆级讲解我最近一年被问得最多的一个问题不是“语义分割怎么做”,而是“我手上有个业务场景,想把 AI 嵌进去,到底从哪一步开始,整个…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:02:35

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:02:35

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑