datetimepocker 是一个日期时间选择器,bootstrap datetimepicker 是 bootstrap 日期时间表单组件。访问 bootstrap-datetimepicker 。

这次在项目中用到日期时间选择器,分享其用法和总结。

一、截图

功能完成后的项目截图

1. 时间起止输入框

2. 十年视图

3. 年视图

4. 月视图

5. 日视图

6. 时视图

二、依赖

1. 需要 bootstrap 的下拉菜单组件 (dropdowns.less) 的某些样式,还有 bootstrap 的 sprites (sprites.less and associated images) 中的箭头图标。

先安装 less

  • 安装淘宝镜像(可能由于网络慢或被墙的原因,npm可能无法访问到)  npm install -g cnpm --registry=https://registry.npm.taobao.org
  • 安装 less cnpm install -g less  (lessc -v返回了版本号说明安装成功)

然后编译 build/build_standalone.less  lessc build/build_standalone.less datetimepicker.css

三、选择器需求

1. 初始化时,开始时间为当前时间减去一年,结束时间为当前时间。

2. 时间格式为 "2018-09-28 00:00:00 "。

3. 开始时间不能大于结束时间。

4. 开始时间不能大于当前时间。

5. 结束时间不能大于当前时间。

四、引入依赖

在 .angular-cli.json 文件中引入 bootstrap-datetimepicker.min.css(刚刚编译成的 datetimepicker.css 的压缩版),bootstrap-datetimepicker.min.js, bootstrap-datetimepicker.zh-CN.js(简体中文格式)。

五、实现

选择器模板,由于该模板不是表单,所以使用双向数据绑定模板语法,将选择的时间流向组件处理,在显示到视图。

当错误提示为空时,将其隐藏。

<div class="start-end-time-search search-item">
<label for="startTime" class="search-label start-time-label">起止时间</label>
<input type="text" [(ngModel)]="startTime" placeholder="请选择开始时间" readonly id="startTime" class="search-input start-time-input">
<label for="endTime" class="search-label end-time-label">至</label>
<input type="text" [(ngModel)]="endTime" placeholder="请选择结束时间" readonly id="endTime" class="search-input end-time-input">
</div>
<button type="button" class="bg-btn search-btn" (click)="searchByKeyword()"
[title]="isEnabledSearchBtn ? '查询离线记录' : '不可用(时间选择不正确)'"
[class.isDisabled]="!isEnabledSearchBtn">
<i class="iconfont icon-search"></i> 查询
</button>
<span class="error-tip" [hidden]="!startTimeErrorTip">{{startTimeErrorTip}}</span>
<span class="error-tip" [hidden]="!endTimeErrorTip">{{endTimeErrorTip}}</span>

选择器组件

定义公有属性并赋值,将开始时间和结束时间赋值为空字符串。

/*定义公有属性*/
public startTime: string = "";
public endTime: string = "";
public isEnabledSearchBtn: boolean = true; // 查询按钮是可用的
public startTimeErrorTip: string = ""; // 开始时间选择错误提示
public endTimeErrorTip: string = ""; // 结束时间选择错误提示

将日期时间格式化,当出现一位数的格式时将其前面加 "0"。并返回两种日期时间格式,一种对象,便于拆分,设置开始时间为当前时间减一年。一种字符串,拼接好的格式。

/*
* 日期时间格式化
* 日期时间格式 "2018-09-28 00:00:00"
* */
dateTimeFormat(dateTime) {
let dateTimeObj = {
"year": dateTime.getFullYear(),
"month": dateTime.getMonth() + 1,
"day": dateTime.getDate(),
"hours": dateTime.getHours(),
"minutes": dateTime.getMinutes(),
"seconds": dateTime.getSeconds()
};
for (let k in dateTimeObj) {
if (dateTimeObj[k] < 10) {
dateTimeObj[k] = "0" + dateTimeObj[k];
}
}
let dateTimeString = dateTimeObj.year + "-" + dateTimeObj.month + "-" + dateTimeObj.day + " "
+ dateTimeObj.hours + ":" + dateTimeObj.minutes + ":" + dateTimeObj.seconds;
return {"obj": dateTimeObj, "string": dateTimeString};
}

这里的当前时间有两种,初始化时和选中时间的时候, 选中时间的当前时间要写在日期被改变时的方法中。

/*页面初始化时,填充时间*/
ngOnInit() {
this.isEnabledSearchBtn = true; // 初始化默认选择按钮可用 let initNowTime = this.dateTimeFormat(new Date()); // 开始时间用当前时间减去一年,结束时间使用当前时间。
this.startTime = initNowTime.obj.year - 1 + "-" + initNowTime.obj.month + "-" + initNowTime.obj.day + " "
+ initNowTime.obj.hours + ":" + initNowTime.obj.minutes + ":" + initNowTime.obj.seconds; this.endTime = initNowTime.string; /*下面处理选择的时间*/
let jQuery: any = $;
let that = this;
jQuery("#startTime").datetimepicker({
autoclose: true, // 选择完成自动关闭时间选择器
format: "yyyy-mm-dd hh:ii:ss", // 时间格式
language: "zh-CN", // 使用简体中文
todayBtn: "linked", // 选择器底部显示今天,快速选择当前时间
todayHighlight: true, // 高亮显示今天,或已被选择的时间
zIndexOffset: 1000 // UI,避免被其他设置了 z-index 样式的元素覆盖
}).on("changeDate", function(startTime){ // 日期被改变时触发
/*选中时间的时候的当前时间格式化*/
let nowTimeString = that.dateTimeFormat(new Date()).string; that.startTime = that.dateTimeFormat(startTime.date).string; if (that.startTime > nowTimeString) {
that.startTimeErrorTip = "开始时间不能大于当前时间";
that.isEnabledSearchBtn = false;
} else if (that.startTime > that.endTime) {
that.startTimeErrorTip = "开始时间不能大于结束时间";
that.isEnabledSearchBtn = false;
} else {
that.startTimeErrorTip = "";
that.endTimeErrorTip = "";
that.isEnabledSearchBtn = true;
}
}).data('datetimepicker'); jQuery("#endTime").datetimepicker({
autoclose: true,
format: "yyyy-mm-dd hh:ii:ss",
language: "zh-CN",
todayBtn: "linked",
todayHighlight: true,
zIndexOffset: 1000
}).on("changeDate", function(endTime) {
/*选中时间的时候的当前时间格式化*/
let nowTimeString = that.dateTimeFormat(new Date()).string; that.endTime = that.dateTimeFormat(endTime.date).string; if (that.endTime > nowTimeString) {
that.endTimeErrorTip = "结束时间不能大于当前时间";
that.isEnabledSearchBtn = false;
} else if (that.startTime > that.endTime) {
that.endTimeErrorTip = "结束时间不能小于开始时间";
that.isEnabledSearchBtn = false;
} else {
that.startTimeErrorTip = "";
that.endTimeErrorTip = "";
that.isEnabledSearchBtn = true;
}
}).data('datetimepicker');
}

六、错误提示演示

时间选择错误时,给出提示,并且查询按钮不可用(提示选择正确的时间)。

bootstrap datetimepicker 在 angular 项目中的运用的更多相关文章

  1. gulp 在 angular 项目中的使用

    gulp 在 angular 项目中的使用 keyword:gulp,angularjs,ng,ngAnnotate,jshint,gulpfile 最后附完整简洁的ng项目gulpfile.js 准 ...

  2. angular项目中各个文件的作用

    原文地址 https://www.jianshu.com/p/176ea79a7101 大纲 1.对angular项目中的一些文件的概述 2.对其中一些文件的详细描述 2.1.package.json ...

  3. Angular 项目中如何使用 ECharts

    在有些使用 ECharts 库的 Angular 项目中,通常除了安装 npm 包之外,还会在 angular.json 中配置 “build.options.scripts”,将 “node_mod ...

  4. angular项目中遇到的问题

    一.angular项目中如何实现路由缓存 需要实现的效果,对请求的数据进行缓存,比如进入文章详情页之后点击返回,不会再调用后台数据接口:而是加载缓存中的数据,如何数据变动的情况下,可使用下拉刷新刷新页 ...

  5. 在angular项目中使用bootstrap的tooltip插件时,报错Property 'tooltip' does no t exist on type 'JQuery<HTMLElement>的解决方法和过程

    在angular4的项目中需要使用bootstrap的tooltip插件. 1. 使用命令安装jQuery和bootstrap npm install bootstrap jquery --save ...

  6. angular项目中使用Primeng

    1.第一步把依赖添加到项目中 npm install primeng --save npm install @angular/animations --save npm install font-aw ...

  7. Angular项目中引入jQuery

    npm install --save jquery npm install @types/jquery --save 在对应的组件中引入 import * as $ from "jquery ...

  8. angular项目中使用jquery的问题

    1.使用npm命令往项目中添加jQuery. npm install jquery --save 2.在你想要用jQuery的组件中添加. import * as $ from "jquer ...

  9. Angular项目中共享模块的实现

    创建share Modele:ng g m share import进来所有需要共享的模块都export出去, 一.共享CommonModule 暂时只有CommonModule,以后会有一些需要共享 ...

随机推荐

  1. 单击GridView进入编辑模式

    一直以来,Insus.NET在实现GridView编辑时,均是在每笔记录第一列或是最后一列放置编辑铵钮,点击编辑铵钮之后,进行编辑模式.本博文是使用另外方式,即是点击GridView记录行任一位置,进 ...

  2. AspxGridView中行的双击事件

    ClientSideEvents-RowDblClick="clike" function clike(s, e) {           grdList.GetRowKey(e. ...

  3. 如鹏网学习笔记(四).Net常用类库

    .Net常用类库 一.String成员方法(常用) 1,bool Contains(string str) 判断字符串对象是否包含给定的内容 2,bool StartsWith(String str) ...

  4. SpringBoot+Mybatis整合入门(一)

    SpringBoot+Mybatis 四步整合 第一步 添加依赖 springBoot+Mybatis相关依赖 <!--springBoot相关--> <parent> < ...

  5. DUBBO监控,设置接口调用数据的上报周期

    目录 DUBBO监控,设置接口调用数据的上报周期 dubbo已有的监控方案 针对已有方案的改进 DUBBO监控,设置接口调用数据的上报周期 dubbo是目前比较好用的,用来实现soa架构的一个工具,d ...

  6. centos7下更新firefox

    下载最新版firefox 1.点击三条线-问号-firefox帮助-安装和更新-linux安装-系统和语言下载 保存到指定目录,比如home下 2.解压 tar xjf firefox-*.tar.b ...

  7. mysql行转列,列转行

    行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...

  8. python中垃圾回收机制

    Python垃圾回收机制详解   一.垃圾回收机制 Python中的垃圾回收是以引用计数为主,分代收集为辅.引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟 ...

  9. jQuery源码学习笔记二

    //添加实例属性和方法 jQuery.fn = jQuery.prototype = { // 版本,使用方式:$().jquery弹出当前引入的jquery的版本 jquery: core_vers ...

  10. CSS字体无法设置成功的问题

    在 CSS 中设置字体名称,直接写中文是可以的.但是在文件编码(GB2312.UTF-8 等)不匹配时会产生乱码的错误.xp 系统不支持 类似微软雅黑的中文. 方案一: 你可以使用英文来替代. 比如 ...