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),仅供参考

相关新闻

用 acbuild 构建 ACI 并在单 Pod 中运行:rkt 的 PostgreSQL + Play Framework 组合镜像示例深度解析

用 acbuild 构建 ACI 并在单 Pod 中运行:rkt 的 PostgreSQL + Play Framework 组合镜像示例深度解析

容器运行时云原生网络 【免费下载链接】rkt [Project ended] rkt is a pod-native container engine for Linux. It is composable, secure, and built on standards. 项目地址: https://gitcode.com/gh_mirrors/rk/rkt 点击查看 免费下载 本指南基于 rkt 仓库 Doc…

2026/9/25 3:53:03 阅读更多 →
4PAM通信仿真:MATLAB代码到Simulink模型迁移调试全记录

4PAM通信仿真:MATLAB代码到Simulink模型迁移调试全记录

做通信仿真这几年,我一直有个习惯:先拿MATLAB脚本把算法跑通,再挪到Simulink里搭模型。这次手搓4PAM的发射接收链路,本来以为就是个“搬砖活”,结果硬是从代码到模型折腾了一整天,编译报错、波形不显示、误…

2026/9/25 3:53:03 阅读更多 →
医疗器械包装验证方案全解析:密封强度、微生物屏障与加速老化避坑指南

医疗器械包装验证方案全解析:密封强度、微生物屏障与加速老化避坑指南

简介:一份面向医疗器械研发、注册与质量控制人员的包装完整性验证方案文档,对应 YY/T0681.1、YY/T0313 等标准要求,可直接用于包装系统符合性评价与试验记录整理。文档共 1 个 doc 文件,压缩包大小约 80KB,虽体量不大&…

2026/9/25 3:53:03 阅读更多 →

最新新闻

深入理解 Sinon 的 `spyCall.firstArg`:读取单次调用首个参数的正确姿势

深入理解 Sinon 的 `spyCall.firstArg`:读取单次调用首个参数的正确姿势

测试开发工具 【免费下载链接】sinon Test spies, stubs and mocks for JavaScript. 项目地址: https://gitcode.com/gh_mirrors/si/sinon 点击查看 免费下载 spyCall.firstArg 是 Sinon 中 spy call 对象的一个核心只读属性,用于获取某一次函数调用传入…

2026/9/25 4:57:52 阅读更多 →
腾讯云WorkBuddy Enterprise企业级AI Agent平台架构与实操指南

腾讯云WorkBuddy Enterprise企业级AI Agent平台架构与实操指南

1. 从零理解 WorkBuddy Enterprise 的定位与核心价值1.1 这个平台到底解决什么问题WorkBuddy Enterprise 是腾讯云推出的一套企业级 AI 平台与 Agent 生态产品。说白了,它要解决的核心问题是:企业想用 AI,但不知道怎么把 AI 能力安全、可控、…

2026/9/25 4:57:52 阅读更多 →
Endnote在Word中消失?COM加载项排查与修复指南

Endnote在Word中消失?COM加载项排查与修复指南

/* 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:57:52 阅读更多 →
Java图书管理系统SWT实战:从环境搭建到避坑指南

Java图书管理系统SWT实战:从环境搭建到避坑指南

/* 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:57:52 阅读更多 →
GDS版图从入门到精通:层次结构、生成流程与-uniquifycellnames避坑指南

GDS版图从入门到精通:层次结构、生成流程与-uniquifycellnames避坑指南

/* 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:57:52 阅读更多 →
Navicat免安装版深度解析:依赖库、配置与MySQL连接排查指南

Navicat免安装版深度解析:依赖库、配置与MySQL连接排查指南

/* 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:56:51 阅读更多 →

日新闻

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

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

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

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

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

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

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

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

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

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

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

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

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

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

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

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

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

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

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

2026/9/24 12:49:17 阅读更多 →