拓冰建站拓冰建站
首页 / 资讯中心 / 正文

ng-zorro-antd InputNumber 受控模式越界值:`out-of-range` 警告样式机制详解

UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载导读在 ng-zorro-antd 的nz-input-number数字输入框中当以受控模式如ngModel传入一个超出nzMin/nzMax范围的value时组件不会强行把数据截断回边界而是通过添加ant-input-number-out-of-range类输出警告样式同时保持输入框中显示的值与业务层存储的数据完全一致。本文将基于该 demoout-of-range.md与底层源码讲解这一机制的设计动机、判定逻辑、样式实现与测试验证并给出可直接运行的完整示例帮助你理解并驾驭受控模式下数字输入框的边界行为。现象demo 演示了什么官方 demoout-of-range.ts的模板与逻辑非常简洁import { Component, signal } from angular/core; import { FormsModule } from angular/forms; import { NzInputNumberModule } from ng-zorro-antd/input-number; Component({ selector: nz-demo-input-number-out-of-range, imports: [FormsModule, NzInputNumberModule], template: nz-input-number [(ngModel)]value nzMin1 nzMax10 / }) export class NzDemoInputNumberOutOfRangeComponent { readonly value signal(99); }其中value被初始化为99而边界是nzMin1、nzMax10。由于采用的是[(ngModel)]受控绑定组件拿到 99 这个越界值后并不会自动回退到 10而是原样显示同时整个输入框落入「超出边界」的警告样式。官方对这一 demo 的描述是当通过受控将value超出边界时提供警告样式。 When thevalueis out of range in controlled mode, a warning style is provided.核心机制out-of-range类的判定源码越界样式的落点并非模板中的某个分支而是组件宿主元素上的一个动态类名。在 input-number.component.ts 中inputNumberClass这个computed信号这样计算protected readonly inputNumberClass computed(() { return { ant-input-number: true, ant-input-number-lg: this.finalSize() large, ant-input-number-sm: this.finalSize() small, ant-input-number-disabled: this.finalDisabled(), ant-input-number-readonly: this.nzReadOnly(), ant-input-number-focused: this.focused(), ant-input-number-rtl: this.dir() rtl, ant-input-number-in-form-item: !!this.nzFormStatusService, ant-input-number-out-of-range: this.value() ! null !isInRange(this.value()!, this.nzMin(), this.nzMax()), ...getVariantClassNames(ant-input-number, this.finalVariant()), ...getStatusClassNames(ant-input-number, this.finalStatus(), this.hasFeedback()) }; });关键一行是ant-input-number-out-of-range: this.value() ! null !isInRange(this.value()!, this.nzMin(), this.nzMax())isInRange是同文件底部的工具函数L599-L601function isInRange(value: number, min: number, max: number): boolean { return value min value max; }由此可以归纳判定规则value为null空值时不会添加out-of-range类value合法且满足min value max时不会添加value小于min或大于max时添加ant-input-number-out-of-range类。需要特别注意的是判定依据是组件内部的value信号由writeValue写入因此只有受控模式下「真实传入的数值」越界才会触发而用户在输入框里敲出尚未确认的越界文本时走的是一条完全不同的路径见下文「输入、失焦、步进按钮的边界行为」。设计动机为什么受控模式允许越界很多开发者会疑惑既然nzMin/nzMax已经定义了边界为什么受控模式下组件不把越界的值直接钳制回范围内官方 FAQdoc/index.en-US.md给出了明确解释在受控模式下开发者可能自己存储相关数据。如果组件把数据约束回范围内会导致展示的数据与实际存储的数据不一致进而在表单字段等场景下引发潜在的数据问题。也就是说nz-input-number在受控模式下遵循「数据以业务层为准」的原则组件只是数据的「显示器 步进器」不是数据的「纠偏器」。强行回退会造成表单底层值与界面显示脱节而显式给出警告样式既保留了数据原貌又让用户感知到数值越界。这一点在源码的writeValue实现中体现得最直接L379-L385writeValue(value: number | null | undefined): void { if (isNil(value)) value null; untracked(() { this.value.set(value); this.setValue(value); }); }writeValue原样保存并展示传入值不做任何getRangeValue钳制。对比之下getRangeValueL609-L634这个钳制工具只出现在失焦修正、步进计算等非受控写入路径中——这正是受控/非受控两条数据链路的边界所在。输入、失焦、步进按钮的边界行为越界样式只描述「受控写入」的状态而用户交互时的越界处理遵循另一套规则理解它们才能避免误用1. 键入越界值不更新 value用户在输入框键入数字时走setValueByTypingL461-L489其中对范围做了拦截if (!isInRange(parsedValue, this.nzMin(), this.nzMax())) { return; } this.updateValue(parsedValue);即键入的解析值一旦越界组件不会把它写入value也就不会触发ngModelChange界面上只保留用户键入的文本。这意味着「越界警告」只在受控数据本身越界时出现不会在输入过程中闪烁。2. 失焦修正回到边界内当输入框失焦blur时组件调用fixValueL498-L525// fix range if (!isInRange(fixedValue, this.nzMin(), this.nzMax())) { fixedValue getRangeValue(fixedValue, this.nzMin(), this.nzMax(), precision); } this.setValue(fixedValue);失焦后越界的键入值会被getRangeValue修正回边界小于min取min大于max取max同时结合nzPrecision做精度化处理getRangeValue内部对边界做了Math.ceil/Math.floor的取整具体方向取决于min/max的正负号源码注释有详细示例。3. 步进按钮/键盘/滚轮越界时直接忽略step方法在一开始就做了越界拦截L410-L419// Ignore step since out of range if ((up this.upDisabled()) || (!up this.downDisabled())) { return; }upDisabled/downDisabledL331-L336依据当前value与边界比较得出protected readonly upDisabled computed(() { return !isNil(this.value()) this.value()! this.nzMax(); }); protected readonly downDisabled computed(() { return !isNil(this.value()) this.value()! this.nzMin(); });当受控value已越界比如 99 且 max10向上步进必然被禁用此时若调用step也会直接忽略同时给上/下箭头加上ant-input-number-handler-up-disabled之类的禁用样式。警告样式的落地LESS 与颜色ant-input-number-out-of-range类的视觉效果定义在 style/index.less// Out Of Range -out-of-range { input { color: error-color; } }实现非常克制仅仅把内部input的文字颜色染成错误色error-color达到「警告」的可视化效果而不改变边框、背景等其他外观。这里需要与「状态样式」区分开nzStatus可选error或warning对应的是ant-input-number-status-error/ant-input-number-status-warning类由getStatusClassNames计算生成相关样式见 style/status.less主要作用于边框与反馈图标而out-of-range是针对受控值越界的独立机制两者可以同时出现、互不冲突。组件 API 中关于nzStatus的说明见 doc/index.en-US.md。测试验证越界类名确实生效官方单元测试对这套机制做了双向验证input-number.component.spec.tsit(should be apply out-of-range class, async () { component.min.set(1); component.max.set(2); component.value 3; fixture.detectChanges(); await updateNonSignalsInput(fixture); expect(hostElement.classList).toContain(ant-input-number-out-of-range); component.value 0; fixture.detectChanges(); await updateNonSignalsInput(fixture); expect(hostElement.classList).toContain(ant-input-number-out-of-range); });测试同时覆盖了「大于 max」与「小于 min」两个方向的越界场景min1, max2时受控值为 3 max或 0 min宿主元素nz-input-number上都会出现ant-input-number-out-of-range类与组件源码中的判定表达式完全一致。完整可用示例与使用建议把官方 demo 稍作扩展可以得到一个可运行、可交互的完整示例import { Component, signal } from angular/core; import { FormsModule } from angular/forms; import { NzInputNumberModule } from ng-zorro-antd/input-number; Component({ selector: app-out-of-range-demo, imports: [FormsModule, NzInputNumberModule], template: nz-input-number [(ngModel)]value nzMin1 nzMax10 [style.width.%]100 / p当前受控 value{{ value() }}/p }) export class OutOfRangeDemoComponent { readonly value signal(99); }使用建议受控模式下数据源本身可能越界如历史数据、服务端下发的脏数据此时组件会显示越界数值并给出警告色你可以结合value()与nzMin/nzMax自行决定是否提交、是否二次校验组件不会替你篡改数据需要强制纠偏时不要在ngModelChange里直接改回边界再写回容易造成数据闪烁更推荐在失焦回调或表单提交阶段使用业务层自己的钳制逻辑处理想要无越界的强约束体验可以放弃受控绑定依赖组件自身的键入拦截与失焦修正setValueByTypingfixValue此时用户永远无法在交互层留下越界值但展示值可能与你存储的数据短暂不一致视觉定制若默认的错误色不够醒目可以在项目样式中覆盖.ant-input-number-out-of-range input的颜色因为该选择器优先级与命名都非常明确。小结「超出边界」demo 揭示的不仅是样式本身更是 ng-zorro-antd InputNumber 在受控模式下的数据哲学展示忠实于数据警告替代纠偏。ant-input-number-out-of-range类的判定、writeValue的原样写入、键入时的越界拦截、失焦时的边界修正以及步进时的禁用逻辑共同构成了一套自洽的边界行为模型。掌握这条机制你在处理表单回显、服务端脏数据、边界校验等场景时就能准确预判组件的每一步表现。赞分享UI组件前端【免费下载链接】ng-zorro-antdAngular UI Component Library based on Ant Design项目地址https://gitcode.com/gh_mirrors/ng/ng-zorro-antd点击查看免费下载相关推荐ant-design InputNumber 受控越界Out of Range警告样式设计动机、源码实现与测试验证ant design InputNumber 受控越界Out of Range警告样式设计动机、源码实现与测试验证 导读 本文基于 ant design前端UI组件设计系统ant-design InputNumber 受控值超出边界警告样式Out of Range的完整实现解析与实践ant design InputNumber 受控值超出边界警告样式Out of Range的完整实现解析与实践 在 React 受控场景下ant des前端UI组件设计系统ng-zorro-antd Code Editor 完全受控模式实战手动接管 Monaco TextModelng zorro antd Code Editor 完全受控模式实战手动接管 Monaco TextModel nz code editor 是 ng zorUI组件前端上一篇Subtitle Edit语音转文字教程用Whisper等本地引擎免费自动生成字幕下一篇cool-admin(midway版)后端服务注册设计与实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门