前言

依照官方例子,要给nz-time-picker组件设置某些时间范围不能选择。

正文

根据列表里设置的开始时间与结束时间,去限制弹框的时间组件选择范围。这里用到了组件的nzDisabledHours与nzDisabledMinutes属性。

html文件:

<form #setForm="ngForm">
<ng-template #setFormContent>
<div class="set-form">
<input id="storeDom" [(ngModel)]="storeTableDate" name="store" hidden/>
<dl class="clearfix">
<dt>面试日期</dt>
<dd><span *ngFor="let item of setDate;let i=index;">{{item.split('年')[1]}}<i (click)="delCalendar(i)">×</i></span><i class="icon-add"
(click)="openCalendar(calendarFormContent,calendarFormFooter)"></i></dd>
</dl>
<div class="two-box">
<dl class="clearfix">
<dt>面试数组</dt>
<dd>
<nz-input-number nzPlaceHolder="请输入" [(ngModel)]="interviewNum" name="interviewNum" [nzMin]="1" [nzMax]="" [nzStep]="1">
</nz-input-number>
</dd>
</dl>
<dl class="clearfix">
<dt>开放场次</dt>
<dd>
<nz-input-number nzPlaceHolder="请输入" [(ngModel)]="openNum" name="openNum" [nzMin]="1" [nzMax]="" [nzStep]="1" (ngModelChange)="changeOpenNum($event)">
</nz-input-number>
</dd>
</dl>
</div>
<p>面试场次的具体时间设置</p>
</div>
<div class="set-table-wrap">
<table class="table">
<thead>
<tr>
<th width="50">场次</th>
<th width="120">开始时间</th>
<th width="120">结束时间</th>
<th>具体时间</th>
<th width="50">名额数</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let item of setTable;let i=index">
<td>第{{i+1}}场</td>
<td>
<nz-time-picker [(ngModel)]="setTable[i].startTime" style="width:100%" name="startTime{{i}}" nzFormat="HH:mm"
[nzMinuteStep]="10" nzPlaceHolder="请选择"></nz-time-picker>
</td>
<td>
<nz-time-picker [(ngModel)]="setTable[i].endTime" style="width:100%" name="endTime{{i}}" nzFormat="HH:mm"
[nzMinuteStep]="10" nzPlaceHolder="请选择"></nz-time-picker>
</td>
<td><span *ngFor="let subItem of setTable[i].detailTime;let j=index;">{{subItem}}<i (click)="delInterviewNum(i,j)">×</i></span><i class="icon-add" (click)="addInterviewNum(timeFormContent,timeFormFooter,i)"></i></td>
<td>{{item.detailTime.length}}</td>
</tr>
</tbody>
</table>
</div>
</ng-template> <ng-template #setFormFooter>
<button class="primary-btn" (click)="saveSet(setForm.form)">生&nbsp;成</button>
<button class="primary-empty-btn" (click)="cancel()">取&nbsp;消</button>
</ng-template>
</form>
<!--时间弹框-start-->
<form #timeForm="ngForm">
<ng-template #timeFormContent>
<nz-time-picker [(ngModel)]="changeTime" style="width:100%" name="time" nzFormat="HH:mm"
[nzDisabledHours]="disabledHours" [nzDisabledMinutes]="disabledMinutes" [nzMinuteStep]="10" nzPlaceHolder="请选择"></nz-time-picker>
</ng-template>
<ng-template #timeFormFooter>
<button class="primary-btn" (click)="addInterviewTime()">添&nbsp;加</button>
<button class="primary-empty-btn" (click)="cancel2()">关&nbsp;闭</button>
</ng-template>
<!--时间弹框-end-->

ts文件:

import { Component, OnInit, TemplateRef } from '@angular/core';
import { NzModalService, NzMessageService, NzModalRef } from '../../../../zorro/ng-zorro-antd.module';
@Component({
selector: 'app-interview-set',
templateUrl: './interview-set.component.html',
styleUrls: ['./interview-set.component.scss']
})
export class InterviewSetComponent implements OnInit {
private scrollLeft;
private scrollTop;
private modal: NzModalRef;
private modal2: NzModalRef;
formValid = false; checkedData = [];
//全局设置-start
setDate = [];//面试日期
newSetDate = [];//日历中选中的日期
interviewNum: Number;//面试数组
openNum: Number;//开放场次
changeTime: Date;
changeTimeArr = [];
openIndex;//表格场次索引
storeTableDate='';//存储表格某一行的值
setTable = [];
calendarMode = 'month';
multipleArr = [];
getTimeItem;
calenderValues; //全局设置-end
constructor(private messageService: NzMessageService, private modalService: NzModalService) { } ngOnInit() {
}
scrollTs(e) {
this.scrollLeft = e.target.scrollLeft;
this.scrollTop = e.target.scrollTop;
}
selectedBox(data) {
data['checked'] = !data['checked'];
if (data['checked']) {
this.checkedData.push(data);
} else {
this.checkedData.forEach((item, index) => {
if (item.sapId == data.sapId) this.checkedData.splice(index, 1);
})
}
}
//---全局设置-start
openSetForm(tplContent: TemplateRef<{}>, tplFooter: TemplateRef<{}>): void {
this.setDate = [];
this.multipleArr = [];
this.newSetDate = [];
this.openNum = 1;
this.changeTime = null;
this.openIndex = null;
this.setTable = [{ startTime: null, endTime: null, detailTime: [] }]
this.modal = this.modalService.create({
nzTitle: '全局设置',
nzContent: tplContent,
nzFooter: tplFooter,
nzMaskClosable: false,
nzClosable: true,
nzWidth: 800,
nzOnCancel: () => {
this.formValid = false;
}
});
}
//打开日历
openCalendar(tplContent: TemplateRef<{}>, tplFooter: TemplateRef<{}>): void {
this.modal2 = this.modalService.create({
nzTitle: '设置日期',
nzContent: tplContent,
nzFooter: tplFooter,
nzMaskClosable: false,
nzClosable: true,
nzWidth: 600,
nzOnCancel: () => {
this.cancel2();
}
});
}
//选择日历
selectedCalendar(arr): void {
this.newSetDate = arr;
}
//保存日历
saveCalendar() {
this.setDate = [...this.newSetDate];
this.multipleArr = [...this.newSetDate];
this.modal2.close();
}
//删除面试日期
delCalendar(i) {
this.setDate.splice(i, 1);
this.multipleArr = [...this.setDate];
}
//更改开放场次
changeOpenNum(num) {
this.setTable = [];
for (let i = 0; i < num; i++) {
let obj = { startTime: null, endTime: null, detailTime: [] }
this.setTable.push(obj);
} }
//面试场次具体时间弹框
addInterviewNum(tplContent: TemplateRef<{}>, tplFooter: TemplateRef<{}>, index): void {
let startTime = this.setTable[index].startTime;
let endTime = this.setTable[index].endTime;
if (!startTime || !endTime) {
this.messageService.info("第" + (index + 1) + "场的开始时间与结束时间为必填!");
}else if(startTime.getTime()>endTime.getTime()){
this.messageService.info("第" + (index + 1) + "场的开始时间不能大于结束时间!");
} else {
this.openIndex = index;
this.changeTime = null;
document.getElementById('storeDom')['value']= JSON.stringify(this.setTable[index]);
this.modal2 = this.modalService.create({
nzTitle: '设置时间',
nzContent: tplContent,
nzFooter: tplFooter,
nzMaskClosable: false,
nzClosable: true,
nzWidth: 300
});
}
}
//选择面试场次具体时间
addInterviewTime() {
if (this.changeTime) {
let tmpTime = this.changeTime.getHours() +':'+ this.changeTime.getMinutes();
this.setTable[this.openIndex].detailTime.push(tmpTime)
}
}
//删除面试场次具体时间
delInterviewNum(i, j) {
this.setTable[i].detailTime.splice(j, 1);
}
cancel() {
this.modal.close();
}
cancel2() {
this.modal2.close();
this.multipleArr = [...this.setDate];
}
disabledHours(): number[] {
  //我这里原本是想通过this.setTable[this.openIndex]对象去拿到表格里的开始时间与结束时间,无奈此this的指向已经不是InterviewSetComponent组件了,而是指向时间的组件。
  //后面就用了比较原始的办法,打开弹窗的时候就把该对象的值赋给某个隐藏dom,然后通过这个dom去拿
let disabledArr=[];
let dateObj = JSON.parse(document.getElementById('storeDom')['value']);
for(let i=0;i<24;i++){
if(i<new Date(dateObj.startTime).getHours() || i>new Date(dateObj.endTime).getHours()) disabledArr.push(i);
}
return disabledArr;
}
disabledMinutes(hours: number): number[] {
let disabledArr=[];
let dateObj = JSON.parse(document.getElementById('storeDom')['value']);
for(let i=0;i<60;i++){
if((hours == new Date(dateObj.startTime).getHours() && i < new Date(dateObj.startTime).getMinutes())
|| (hours == new Date(dateObj.endTime).getHours()&& i > new Date(dateObj.endTime).getMinutes())) disabledArr.push(i);
}
return disabledArr;
}
//---全局设置-end
}

好了,就酱。

TimePicker - NG-ZORRO设置的更多相关文章

  1. 安卓开发_浅谈TimePicker(时间选择器)

    TimePicker也继承自FrameLayout类.时间选择控件向用户显示一天中的时间(可以为24小时,也可以为AM/PM制),并允许用户进行选择.如果要捕获用户修改时间数据的事件,便需要为Time ...

  2. 时间选择器(TimePicker)

    时间选择器(TimePicker) 显示一个可供时间选择的界面 常用方法: setIs24HourView(true|false) 设置24小时格式,true为24小时格式 setCurrentHou ...

  3. Android中TimePicker时间选择器的使用和获取选择的时和分

    场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...

  4. 52ABP模板 ASP.Net Core 与 Angular的开源实例项目

    阅读文本大概需要 5 分钟. 开始之前 自从上一篇文章".NET:持续进化的统一开发平台"发布后,已经有三个月的时间没有写过文章了. 这段时间,做了两场线下活动,一场在上海,一场在 ...

  5. Android 中常见控件的介绍和使用

    1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.la ...

  6. 每天一点Android干货-时间与日期、进度条

    时间控件TimePicker的使用方法 timePicker.setIs24HourView(true); //设置是否以24小时制显示 timePicker.getCurrentHour(); // ...

  7. Android --时间控件的使用

    1. mian.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns: ...

  8. Robotium API -- 除click/clickLong外的其他操作

    拖动操作 void drag (float fromX, float toX, float fromY, float toY, int stepCount) 选定两个位置,进行拖动操作(这里的拖动操作 ...

  9. 记录项目版本升级angular4 ~ angular5

    前言: 在上一篇ng4文章<angular4--实际项目搭建总结>中说过,等到ng5正式发布,并且蚂蚁的NG ZORRO兼容ng5之后,我会对ng4项目进行升级.这篇文章就是大概说下升级的 ...

  10. 如何用ABP框架快速完成项目(6) - 用ABP一个人快速完成项目(2) - 使用多个成熟控件框架

    正如我在<office365的开发者训练营,免费,在微软广州举办>课程里面所讲的, 站在巨人的肩膀上的其中一项就是, 尽量使用别人成熟的框架. 其中也包括了控件框架   abp和52abp ...

随机推荐

  1. 操作系统——银行家算法(Banker's Algorithm)

    之前写过一篇关于死锁和银行家算法的详细描述的博客https://www.cnblogs.com/wkfvawl/p/11598647.html 写这篇博客的目的,主要是详细讲解一下银行家算法以及代码的 ...

  2. python:利用celery分布任务

    Celery是一个功能完备即插即用的任务队列.它使得我们不需要考虑复杂的问题,使用非常简单.celery看起来似乎很庞大.celery适用异步处理问题,当发送邮件.或者文件上传, 图像处理等等一些比较 ...

  3. 网站统计IP PV UV

    ###我只是一个搬运工 网站流量统计可以帮助我们分析网站的访问和广告来访等数据,里面包含很多数据的,比如访问使用的系统,浏览器,ip归属地,访问时间,搜索引擎来源,广告效果等. PV(访问量):Pag ...

  4. 官方宣布IPV4已然耗尽,IPv6D风口或将到来?

    急救箱 IPV4真的用完了吗? ​ IPV4真的用完了吗?其实 小兰 一点也不惊讶 ,毕竟全球人口这么多,多N的几次幂就用完了吧- 43亿个IPv4地址已分配完毕,这意味着没已经有更多的IPv4地址可 ...

  5. 2019-10-29:渗透测试,基础学习,sqlmap文件读取,写入,dnslog盲注作用,mssql手工注入,笔记

    sqlmap参数--file-read,从数据库服务器中读取文件--file-write,--file-dest,把文件上传到数据库服务器中 dnslog平台的学习和它在盲注中的应用1,判断注入点2, ...

  6. 2019-9-11:渗透测试,基础学习,VMware安装centos 7

    VMware Workstation 15 Pro 安装Centos 7,详细图文步骤 1,点击VMware菜单栏的“文件”-->“新建虚拟机”,选择“典型”使用向导创建虚拟机,点击“下一步” ...

  7. day 27 网路编程 面向对象多继承

    知识补充: 字符串转化为字节 string1  = input(“请输入你的名字”) string1.encode('utf-8') 字节转化为字符串 byte1 = b"alex" ...

  8. 分发系统介绍、expect脚本远程登录、expect脚本远程执行命令、expect脚本传递参数

    7月19日任务 20.27 分发系统介绍20.28 expect脚本远程登录20.29 expect脚本远程执行命令20.30 expect脚本传递参数 20.27 分发系统介绍 公司业务逐渐扩大时, ...

  9. 一文了解Nuget的使用

    Nuget介绍 官网定义:NuGet是.NET的软件包管理器(免费).NuGet客户端工具提供了生成和使用软件包的能力.NuGet Gallery 是所有软件包作者和消费者都使用的中央软件包存储库. ...

  10. 面试阿里被分布式“搞懵”,Redis、MongoDB、memcached没答上来

    都说大厂面试难,一点也没有错,一线大厂的面试究竟怎么样还得自己亲身经历了才知道.小白面试阿里,就被面试官吊打,一问分布式就被“搞懵”了,Redis.MongoDB.Memcached都没答好,很多没有 ...