
UI组件前端【免费下载链接】ngx-bootstrapFast and reliable Bootstrap widgets in Angular (supports Ivy engine)项目地址https://gitcode.com/gh_mirrors/ng/ngx-bootstrap点击查看免费下载导读本文围绕 ngx-bootstrap 的 Timepicker 组件在 Demo 中提供的Custom validation with isValid event自定义校验与 isValid 事件示例展开讲解如何通过isValid输出事件实时监听用户输入的时、分、秒是否合法并据此在页面上呈现成功/危险告警反馈。读完本文你将掌握isValid事件的触发时机、底层校验函数的实现原理含allowEmptyTime、min/max边界的影响以及如何在自己的 Angular 应用中复刻这一套可视化校验方案。1. 场景概述这个用例解决什么问题在 docs/spec/timepicker/timepicker.examples.custom-validation-event.use-case.md 所描述的场景中用户在 Timepicker 演示页中点击Custom validation with isValid event子菜单后会看到一个包含小时、分钟输入框的 timepicker 组件可点击的 AM/PM 按钮12 小时制模式一个展示当前日期与时间的成功告警success alert。该用例的核心目标是向用户展示如何在 timepicker 中使用自定义校验配合isValid事件。关键交互路径Main success scenario为用户在小时输入框中输入非法时间或任意字符串时页面上会出现两个 danger 告警——一个是 Invalid time另一个是 Time is: 信息当用户在分钟输入框中输入非法时间或字符串时这两个 danger 告警保持存在当用户点击任意上下箭头spinner时日期恢复为合法值取当前时间最近的日期。注意其中的第 7 条明确要求组件源码应包含isValid方法这正是本用例区别于其他校验方式的标志。2. 示例源码逐行解读在仓库中该示例的完整实现位于 isvalid.ts 与 isvalid.html。组件类TypeScript部分非常精简import { Component } from angular/core; Component({ // eslint-disable-next-line angular-eslint/component-selector selector: demo-timepicker-isvalid, templateUrl: ./isvalid.html, standalone: false }) export class DemoTimepickerIsValidComponent { isMeridian true; myTime new Date(); valid true; isValid(event: boolean): void { this.valid event; } }关键点说明myTime new Date()作为ngModel绑定的初始值因此页面打开时即为合法时间valid true是校验状态位初始为合法isValid(event: boolean)就是 use-case 中要求的isValid 方法它把 timepicker 通过isValid事件发射出的布尔值直接存入valid属性驱动模板中的告警显示。模板部分HTML是视觉反馈的核心timepicker [(ngModel)]myTime [showMeridian]isMeridian (isValid)isValid($event)/timepicker hr pre classalert [class.alert-danger]!valid [class.alert-success]valid Time is: {{myTime}} /pre if (!valid) { div classalert alert-dangerInvalid time/div }可以看到三个关键绑定(isValid)isValid($event)订阅组件的isValid输出事件pre上的alert-danger/alert-success类切换valid为false时显示红色 danger 样式为true时显示绿色 success 样式同时正文输出Time is: {{myTime}}——这正是 use-case 中1 个 Invalid time 1 个 Time is:两个告警的由来if (!valid)条件块仅当校验不通过时渲染额外的 Invalid time danger 告警。3. isValid 事件在组件中的定义与发射时机isValid是 TimepickerComponent 声明的一个输出事件定义于 timepicker.component.ts/** emits true if value is a valid date */ isValid outputboolean();从源码看isValid会在以下两类路径中发射路径一Store 状态流订阅组件构造器_store.select(state state.controls) .subscribe((controlsState: TimepickerControls) { const isTimepickerInputValid isInputValid(this.hours, this.minutes, this.seconds, this.isPM()); const isValidResult this.config.allowEmptyTime? this.isOneOfDatesIsEmpty() || isTimepickerInputValid : isTimepickerInputValid; this.isValid.emit(isValidResult); Object.assign(this, controlsState); _cd.markForCheck(); });每当 timepicker 的 controls 状态如通过箭头、滚轮、键盘上下键改变时间后更新就会基于当前hours、minutes、seconds三个 UI 字段重新计算合法性并立即emit。路径二输入框失焦change事件模板中每个输入框的(change)事件分别绑定到updateHours、updateMinutes、updateSeconds见 timepicker.component.html 中的(change)updateHours($event.target)等。这三个方法内部逻辑一致以小时为例updateHours(target?: PartialEventTarget | null): void { this.resetValidation(); this.hours (target as HTMLInputElement).value; const isTimepickerInputValid isHourInputValid(this.hours, this.isPM()) this.isValidLimit(); const isValidResult this.config.allowEmptyTime ? this.isOneOfDatesIsEmpty() || isTimepickerInputValid : isTimepickerInputValid; if (!isValidResult) { this.invalidHours true; this.isValid.emit(false); this.onChange(null); return; } this._updateTime(); }当输入非法时组件会做三件事将invalidHours置为true从而在模板中给该输入框添加.is-invalid/.has-error类见模板中[class.is-invalid]invalidHours立即isValid.emit(false)通知父组件校验失败调用onChange(null)把模型值清空保证绑定的myTime不再携带非法值。这就是 use-case 中输入非法值后 Time is: 显示非法信息、同时出现 Invalid time 告警的完整机制。若校验通过则调用_updateTime()通过TimepickerStore派发setTimeaction 更新模型。4. 底层校验函数合法性是如何判定的所有判定逻辑都收敛在 timepicker.utils.ts 中的一组纯函数里函数作用判定规则parseHours(value, isPM)解析小时转数字后必须满足0 h 2412 小时制下0 h 12否则返回NaNparseMinutes(value)解析分钟0 m 60否则返回NaNparseSeconds(value)解析秒0 s 60否则返回NaNisHourInputValid/isMinuteInputValid/isSecondInputValid单项校验对应解析结果不为NaN即为合法isInputLimitValid边界校验用当前输入构造新 Date 后与max/min比较越界返回falseisInputValid整体校验小时、分钟、秒三项同时合法才返回true其中isInputValid的完整实现为export function isInputValid( hours: string, minutes 0, seconds 0, isPM: boolean ): boolean { return isHourInputValid(hours, isPM) isMinuteInputValid(minutes) isSecondInputValid(seconds); }因此输入任意非数字字符串如字母会被parseInt得到NaN从而三项校验失败、isValid发射false输入超范围数字如小时填 99同样会被判为非法。这一行为在测试 timepicker.component.spec.ts 中有直接佐证例如 should clear model if hour input is invalid 用例断言component.updateHours(inputHours)后isValid.emit以false被调用且invalidHours为true。4.1 allowEmptyTime 对 isValid 的影响从构造器与updateHours的逻辑可以看出是否把空时间判为非法由TimepickerConfig.allowEmptyTime决定默认false见 timepicker.config.tsallowEmptyTime false默认只要存在空字段即视为非法isValid发射falseallowEmptyTime true只要三个字段之一为空isOneOfDatesIsEmpty()为真就直接视为合法避免把尚未填完的时间误报为错误。对应测试 should emit isValid with false when allowEmptyTime is false 与 should emit isValid with true when allowEmptyTime is truetimepicker.component.spec.ts分别验证了这两种行为。4.2 min/max 边界同样影响 isValidisValidLimit()组件方法内部委托isInputLimitValid把输入的小时/分钟/秒连同isPM标志构造为候选时间再与min、max比较。超出边界的输入即使数字格式合法也会被判为非法并发射false。测试 should clear model if hour limits are invalid 通过 mockisValidLimit返回false来验证这一路径。5. 从输入非法到恢复合法的完整交互链结合 use-case 与源码可以完整还原用户的交互链路用户输入非法小时/分钟值 │ ▼ (change) 事件触发 updateHours / updateMinutes │ ├── 非法格式或越界──► invalidHours/invalidMinutes true │ isValid.emit(false) │ onChange(null)模型被清空 │ ► 页面出现 Invalid time danger 告警 Time is: 红色告警 │ └── 合法 ──► _updateTime() ──► dispatch setTime ──► Store 更新 isValid.emit(true)经由 controls 状态订阅 ► 页面恢复 success 绿色告警其中点击任意箭头恢复合法对应模板中的 spinner 按钮(click)changeHours(hourStep())以及changeMinutes、changeSeconds这些方法首先调用resetValidation()清空三个invalid*标志再 dispatchchangeHours/changeMinutes/changeSecondsaction 更新 StoreStore 的 controls 状态变化又触发构造器中的订阅重新计算并isValid.emit(true)——于是日期被重置为从当前时间出发的最近合法值页面恢复绿色 success 状态。整个状态流转依赖 ngx-bootstrap 内部的 mini-ngrx 架构timepicker.actions.ts 定义了WRITE_VALUE、CHANGE_HOURS、CHANGE_MINUTES、CHANGE_SECONDS、SET_TIME_UNIT、UPDATE_CONTROLS六类 actiontimepicker.store.ts 基于BehaviorSubject与 reducer 维护状态。isValid事件正是在 controls 状态被更新后同步发射的因此它天然与组件内部所有改时间的途径箭头、滚轮、键盘、AM/PM 切换、模型写入保持一致的语义。6. 在你的 Angular 应用中复刻该方案参考示例组件的做法你可以用最少的代码实现同样的实时校验模板中订阅事件并做条件样式切换timepicker [(ngModel)]myTime [showMeridian]true (isValid)isValid($event)/timepicker pre classalert [class.alert-danger]!valid [class.alert-success]valid Time is: {{myTime}} /pre if (!valid) { div classalert alert-dangerInvalid time/div }组件中维护校验状态myTime new Date(); valid true; isValid(event: boolean): void { this.valid event; }按需调整配置如需容忍空时间可将TimepickerConfig.allowEmptyTime置为true如需配合表单可参考同仓库的 custom-validation 示例使用UntypedFormControl与自定义 validator 约束时间范围把isValid事件与表单校验叠加使用。需要注意isValid事件只反映当前输入是否为合法时间它不会阻止非法值写入输入框而是通过onChange(null)清空模型。若需要不允许输入级别的拦截应结合readonlyInput、disabled或表单 validator 使用。7. 与周边示例的关系及测试保障在 timepicker-section.list.ts 中Custom validation with isValid eventanchor:isvalid被登记为 Overview 页面的第 11 个示例其说明文字为isValidevent emits true if a value is a valid data. Enter an invalid data to see error这印证了该事件的设计意图发射true表示值合法输入非法数据即可看到错误反馈。它与此前的 Custom validation 示例基于 Angular 表单 validatoranchor:custom-validation形成互补前者演示表单层的自定义校验后者演示组件事件层的实时状态反馈。仓库同时通过 timepicker.component.spec.ts约 1574 行覆盖了isValid事件在清空日期小时/分钟/秒非法输入min/max 越界allowEmptyTime 开关等多条路径下的发射行为确保该事件在不同配置组合下语义稳定可作为你自行扩展校验逻辑时的行为基准。小结ngx-bootstrap Timepicker 的isValid事件提供了一条从组件内部到页面反馈的实时校验通道它基于 store 状态与输入框 change 事件同步发射布尔值背后由timepicker.utils.ts的纯函数完成格式与边界判定并受allowEmptyTime、min/max配置影响。结合本文给出的示例源码你可以轻松在项目中实现非法时间即时标红 模型清空 恢复合法即回绿的完整体验。赞分享UI组件前端【免费下载链接】ngx-bootstrapFast and reliable Bootstrap widgets in Angular (supports Ivy engine)项目地址https://gitcode.com/gh_mirrors/ng/ngx-bootstrap点击查看免费下载相关推荐【亲测免费】 使用Bootstrap时间选择器(bootstrap-timepicker): 详细指南及实例解析使用Bootstrap时间选择器 bootstrap timepicker : 详细指南及实例解析 一、项目介绍 Bootstrap 时间选择器 bootstrUI库/组件Trivy 自定义检查进阶使用 Combine 合并输入实现跨文件一致性校验Trivy 自定义检查进阶使用 Combine 合并输入实现跨文件一致性校验 Trivy 的 Misconfiguration 扫描默认对每个配置文件独立求值应用安全漏洞扫描SBOM供应链安全云原生ngx-admin 表单控件自定义验证器与异步校验实现ngx admin 表单控件自定义验证器与异步校验实现 在企业级后台系统开发中表单验证是确保数据准确性和用户体验的关键环节。ngx admin作为基于Ang前端UI组件上一篇如何用QMCDecode三步解锁QQ音乐加密文件Mac用户的音乐自由指南下一篇Aperant PR 1575 后续修复深度解析XState 任务状态生命周期与跨项目污染问题的根治方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考