
UI组件前端【免费下载链接】ngx-bootstrapFast and reliable Bootstrap widgets in Angular (supports Ivy engine)项目地址https://gitcode.com/gh_mirrors/ng/ngx-bootstrap点击查看免费下载本文以 ngx-bootstrap 官方文档中的Timepicker Dynamic 示例用例编号 14.12为主线深入讲解如何在 Angular 应用中构建一个可被外部按钮驱动的动态时间选择器通过Set to 14:00与Clear两个按钮在运行时修改 timepicker 的值、清空输入框并借助isValid事件与allowEmptyTime配置实时反馈时间格式是否合法。读完本文你将掌握 timepicker 与ngModel双向绑定、TimepickerConfig依赖注入覆盖、isValid事件监听以及Date动态写入/清空的完整实战方案。场景概览Dynamic 示例要解决什么问题在 ngx-bootstrap 的 Timepicker 演示页DEMO / Bootstrap 3 与 4中Dynamic 子菜单展示了一个非常典型的业务场景时间选择器本身仍由用户手工输入但同时还需要外部按钮以编程方式修改或清空时间值。这在表单联动、快捷时间填充、重置按钮等需求中十分常见。原用例文档docs/spec/timepicker/timepicker.examples.dynamic.use-case.md描述的主成功场景为用户打开 Timepicker 演示页用户点击 Dynamic 子菜单用户看到包含小时、分钟输入框、可点击的AM/PM按钮以及一个显示当前日期与时间的信息提示info alert的时间选择器用户看到两个可点击按钮Set to 14:00与Clear点击Set to 14:00后小时输入框显示02、分钟输入框显示00按钮显示PM点击Clear后输入框被清空小时输入框显示占位符HH、分钟输入框显示占位符MM按钮显示AM页面上同时存在Time is: 信息提示与Invalid time format危险提示再次点击Set to 14:00小时输入框再次显示02、分钟显示00、按钮显示PM。文档还记录了一个变体用户可能通过滚动页面到达 Dynamic 子菜单而非直接点击。可以看到该示例的核心价值在于14:0024 小时制在 12 小时制AM/PM显示模式下被渲染为02PM并且清空输入后占位符与校验状态会同步恢复。这两点恰好是 timepicker 编程式赋值场景中最容易踩坑的地方下面我们从真实代码出发逐一拆解。组件实现完整代码与逐行解读Dynamic 示例的真实实现位于 libs/doc-pages/timepicker/src/lib/demos/dynamic/dynamic.ts 与 dynamic.html。TypeScript 组件import { Component } from angular/core; import { TimepickerConfig } from ngx-bootstrap/timepicker; export function getTimepickerConfig(): TimepickerConfig { return Object.assign(new TimepickerConfig(), { allowEmptyTime: true }); } Component({ // eslint-disable-next-line angular-eslint/component-selector selector: demo-timepicker-dynamic, templateUrl: ./dynamic.html, providers: [{ provide: TimepickerConfig, useFactory: getTimepickerConfig }], standalone: false }) export class DemoTimepickerDynamicComponent { mytime: Date | undefined new Date(); isValid?: boolean; update(): void { const time new Date(); time.setHours(14); time.setMinutes(0); this.mytime time; } changed(): void { console.log(Time changed to: ${this.mytime}); } clear(): void { this.mytime void 0; } }关键点逐项说明mytime初始化为new Date()页面首次渲染时 timepicker 即显示当前系统时间小时、分钟与 AM/PM 均由该 Date 渲染而来对应用例步骤 3 中包含当前日期和时间的信息提示。update()编程式写入 14:00先取当前日期再setHours(14)、setMinutes(0)然后赋给mytime。由于 timepicker 通过ngModel双向绑定这个赋值会立即驱动内部状态更新并重绘输入框——小时显示02、分钟显示00、meridian 按钮显示PM详见后文12 小时制渲染一节。clear()清空时间this.mytime void 0;将绑定值置为undefined。这是清空的正规写法配合allowEmptyTime: true配置清空后的输入不会被标记为非法格式。changed()变更日志通过(ngModelChange)输出每次由用户手工输入或编程赋值引起的值变化打印到控制台。模板timepicker [(ngModel)]mytime (ngModelChange)changed() (isValid)isValid $event/timepicker pre classalert alert-infoTime is: {{mytime}}/pre if (!isValid) { pre classalert alert-dangerInvalid time format/pre } button typebutton classbtn btn-primary (click)update()Set to 14:00/button button typebutton classbtn btn-danger (click)clear()Clear/button模板中值得注意的三处(isValid)isValid $eventtimepicker 的isValid输出outputboolean()定义于 src/timepicker/timepicker.component.ts会在值合法时发出true、非法时发出false。模板据此条件渲染Invalid time format危险提示与用例步骤 7 完全对应。pre classalert alert-infoTime is: {{mytime}}/pre直接插值显示当前绑定值。当mytime为undefined时插值显示为空对应清空后的状态。两个操作按钮update()对应Set to 14:00btn-primaryclear()对应Clearbtn-danger与用例步骤 4 一致。需要说明的是if是 Angular 17 的模板控制流语法该 demo 代码库的模板已采用这种写法如果你使用的是更早的 Angular 版本可将if (!isValid) {...}改写为*ngIf!isValid以保持兼容。演示入口与路由Dynamic demo 组件通过 libs/doc-pages/timepicker/src/lib/demos/index.ts 中的DEMO_COMPONENTS数组注册并在 timepicker-section.list.ts 中以title: Dynamic、anchor: dynamic挂载到文档页的 Overview 与 Examples 两个分页中路由入口见 demo-timepicker.routes.ts。这意味着你可以在本地构建文档站点后通过侧边栏Timepicker → Dynamic直接体验该示例。为什么显示02 PM12 小时制渲染原理用例步骤 5 断言点击Set to 14:00后小时输入框显示02、meridian 按钮显示PM。这背后的逻辑位于 src/timepicker/timepicker.component.ts 的_renderTime(value)const _hoursPerDayHalf 12; let _hours _value.getHours(); if (this.showMeridian()) { this.meridian this.meridians()[_hours _hoursPerDayHalf ? 1 : 0]; this.meridianChange.emit(this.meridian); _hours _hours % _hoursPerDayHalf; // should be 12 PM, not 00 PM if (_hours 0) { _hours _hoursPerDayHalf; } } this.hours padNumber(_hours); this.minutes padNumber(_value.getMinutes()); this.seconds padNumber(_value.getUTCSeconds());拆解来看showMeridian()默认开启TimepickerConfig.showMeridian true见 src/timepicker/timepicker.config.ts因此默认采用 12 小时制。14 12所以meridian取meridians()[1]即PM。_hours 14 % 12 2再经padNumbersrc/timepicker/timepicker.utils.ts不足两位补零渲染为02。边界情况00点午夜的 12 小时制会被修正为12这正是代码注释should be 12 PM, not 00 PM的含义。因此14:00在界面上呈现为02 : 00 PM与用例断言完全吻合。反过来说如果你在 24 小时制showMeridian false下运行update()后小时框则会直接显示14。allowEmptyTime配置让空时间合法Dynamic 示例在providers中通过工厂函数覆盖了全局TimepickerConfigproviders: [{ provide: TimepickerConfig, useFactory: getTimepickerConfig }]其中getTimepickerConfig()返回return Object.assign(new TimepickerConfig(), { allowEmptyTime: true });allowEmptyTime的语义定义在 src/timepicker/timepicker.config.ts当为true时空时间不会被标记为非法if true emptyTime is not marked as invalid。默认值为false。这个配置直接决定了Clear按钮的体验。timepicker 内部在多个校验点都会检查它例如_renderTime之外src/timepicker/timepicker.component.ts 中监听 store 的controls状态时会计算const isTimepickerInputValid isInputValid(this.hours, this.minutes, this.seconds, this.isPM()); const isValidResult this.config.allowEmptyTime? this.isOneOfDatesIsEmpty() || isTimepickerInputValid : isTimepickerInputValid; this.isValid.emit(isValidResult);isOneOfDatesIsEmptysrc/timepicker/timepicker.utils.ts检查小时/分钟/秒是否任一为空export function isOneOfDatesIsEmpty(hours: string, minutes: string, seconds: string): boolean { return hours.length 0 || minutes.length 0 || seconds.length 0; }于是当mytime被清空、输入框变为空时若allowEmptyTime true空输入直接视为合法isValid发出trueInvalid time format提示不会出现若allowEmptyTime false空输入被视为非法isValid发出false危险提示出现。动态示例选择开启allowEmptyTime所以用例步骤 6 中清空后输入框显示占位符HH/MM、按钮回到AM而不会触发错误提示。同一配置也被 empty-date 示例 复用你可以对照阅读。占位符从哪里来清空后输入框显示的HH与MM并非硬编码在模板中而是来自配置的默认值hoursPlaceholder HHminutesPlaceholder MMsecondsPlaceholder SS定义于 src/timepicker/timepicker.config.ts在 timepicker.component.html 中通过[placeholder]hoursPlaceholder()绑定到输入框。当_renderTime收到空值/无效值时会把hours、minutes、seconds全部置为并将meridian重置为meridians()[0]即AM从而展示出占位符与AM状态——这正是用例步骤 6 所描述的画面。内部数据流从mytime赋值到界面更新update()/clear()只是改了组件属性为什么 timepicker 会自动重绘答案在 timepicker 采用的 mini-ngrx 状态管理结构中writeValue入口TimepickerComponent实现了ControlValueAccessor见 src/timepicker/timepicker.component.ts。当ngModel的值变化时Angular 调用writeValue(obj)其中obj nullundefined/null时 dispatchwriteValue()空值 action否则 dispatchwriteValue(parseTime(obj))src/timepicker/timepicker.component.ts。Reducer 更新 storeWRITE_VALUEaction 在 src/timepicker/reducer/timepicker.reducer.ts 中被处理更新state.value。订阅回流构造函数中_store.select(state state.value)的订阅src/timepicker/timepicker.component.ts收到新值后调用_renderTime(value)重绘输入框并触发onChange(value)把值写回表单模型同时 dispatchupdateControls(...)重新计算canIncrementHours等控件可用性状态。isValid 联动controls订阅中重新计算校验结果并通过this.isValid.emit(...)发出模板中的if (!isValid)随之更新。而update()里time.setHours(14); time.setMinutes(0)后赋给mytime实际产生的是一个保留当前年/月/日、仅小时分钟被改写的Datereducer 中setTime/changeTime也通过createDate保留了日期部分src/timepicker/timepicker.utils.ts注释#3139 ensure date part remains unchanged因此Time is: 提示中展示的始终是当前日期 14:00的组合而不是单独一个时间对象。测试佐证isValid与allowEmptyTime的行为契约上述行为并非仅有代码推导仓库中的单元测试 src/timepicker/testing/timepicker.component.spec.ts 对此有直接断言描述块validate input fields with property of allowEmptyTime中当allowEmptyTime false时清空日期isValid发出false当allowEmptyTime true时清空日期isValid发出true。另有测试断言清空日期时isValid发出false的默认行为以及多个输入校验分支小时/分钟/秒非法时isValid发出false。这些测试精确对应了 Dynamic 示例中清空后是否出现 Invalid time format 提示这一用户体验分支可作为你在自己项目中使用isValid事件与allowEmptyTime时的行为契约参考。在你的项目中复现与改造安装与引入timepicker 组件可通过ng add ngx-bootstrap --component timepicker一键添加或手动引入import { TimepickerModule } from ngx-bootstrap/timepicker;独立组件standalone用法在组件的imports中加入TimepickerModule模块用法在NgModule的imports中加入TimepickerModule。两种写法的示例见 libs/doc-pages/timepicker/src/lib/docs/usage.md。核心代码骨架// component.ts mytime: Date | undefined new Date(); update(): void { const time new Date(); time.setHours(14); time.setMinutes(0); this.mytime time; } clear(): void { this.mytime void 0; }!-- component.html -- timepicker [(ngModel)]mytime (ngModelChange)changed() (isValid)isValid $event/timepicker pre classalert alert-infoTime is: {{mytime}}/pre if (!isValid) { pre classalert alert-dangerInvalid time format/pre } button typebutton classbtn btn-primary (click)update()Set to 14:00/button button typebutton classbtn btn-danger (click)clear()Clear/button// 如需开启空时间合法覆盖全局配置 export function getTimepickerConfig(): TimepickerConfig { return Object.assign(new TimepickerConfig(), { allowEmptyTime: true }); } providers: [{ provide: TimepickerConfig, useFactory: getTimepickerConfig }]常见改造点与注意事项改成 24 小时制在模板传入[showMeridian]false则update()后小时框显示14Set to 14:00的语义更直观清空语义使用void 0即undefined而非null或空字符串以匹配writeValue对空值的处理分支若使用null亦可obj null同时覆盖两者非空校验需求如果你需要清空即报错例如必填时间字段保持allowEmptyTime false默认值即可此时清空后Invalid time format会立即出现可用isValid事件驱动表单错误提示监听值变化changed()中的console.log可替换为你的业务回调ngModelChange在用户手工输入与编程赋值两种情况下都会触发。小结Timepicker Dynamic 示例展示的是外部控制 表单绑定的组合范式ngModel负责双向数据流update()/clear()负责编程式写入与清空isValid事件与allowEmptyTime配置共同决定空值/非法格式的呈现方式而_renderTime中的 12 小时制换算则保证了14:00会以02 PM的形式正确呈现。这套机制由 timepicker.component.ts 的 ControlValueAccessor 实现与 mini-ngrx reducer 数据流共同支撑并有 timepicker.component.spec.ts 中的测试用例作为行为契约。掌握这些要点后你可以轻松地把快捷时间填充、重置时间、空值校验等交互无缝接入自己的 Angular 表单。赞分享UI组件前端【免费下载链接】ngx-bootstrapFast and reliable Bootstrap widgets in Angular (supports Ivy engine)项目地址https://gitcode.com/gh_mirrors/ng/ngx-bootstrap点击查看免费下载相关推荐ngx-bootstrap 动态 AccordionDynamic Accordion示例解析运行时动态新增面板的实现原理与实战ngx bootstrap 动态 AccordionDynamic Accordion示例解析运行时动态新增面板的实现原理与实战 本篇文章围绕 ngx bUI组件前端【亲测免费】 使用Bootstrap时间选择器(bootstrap-timepicker): 详细指南及实例解析使用Bootstrap时间选择器 bootstrap timepicker : 详细指南及实例解析 一、项目介绍 Bootstrap 时间选择器 bootstrUI库/组件ngx-bootstrap Accordion 动态内容示例从用例规格到源码级实现解析ngx bootstrap Accordion 动态内容示例从用例规格到源码级实现解析 导读 本文围绕 ngx bootstrap 官方 AccordionUI组件前端上一篇钉钉打卡模拟定位完整教程3步上手Xposed钉钉助手下一篇3个核心优势为什么ESP32 Arduino是物联网开发的首选方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考