由於業務需求,需要實現能根據選擇的查詢時間類別進行不同類別的查詢。上次做的nz-range-picker雖然能夠滿足需求,但是用起來體驗就不是很好。那么我覺得優化用戶的體驗就是非常必要的,畢竟自己這里都過不了,談何給別人使用呢?這是上次做的
nz-range-picker:nz-range-picker 默認展示當前月和上個月,不可選用日期為今日之后和180天之前。


根據選擇的統計類別不同選擇的時間控件也不同,起始時間選擇器打開默認展示上一年,結束時間展示當前年(這邊做的交互后面代碼有,就不做演示了)。
話不多說搞上代碼:
1.首先實現下拉選擇框:
html:
<nz-select [(ngModel)]="queryType" [nzMode]="'default'" [nzAllowClear]="false"
nzShowSearch nzAllowClear [nzPlaceHolder]="'統計類別'"
class="inpute-w175 margin7">
<nz-option *ngFor="let option of selectType" nzCustomContent [nzValue]="option.value"
[nzLabel]="option.name">
{{option.name}}
</nz-option>
</nz-select>
.ts:
/**
* 統計類型
*/
slectType: Array<{ name: string; value: string }> = [
{
name: '按年統計',
value: '1'
},
{
name: '按季度統計',
value: '2'
},
{
name: '按月統計',
value: '3'
},
{
name: '按周統計',
value: '4'
},
{
name: '按年日統計',
value: '5'
},
];
/**
* 選擇的統計類型
*/
queryType: any = '1';
2.實現日期選擇器:
html:
<!-- 下面根據ngif展示對應的事件選擇器控件 -->
<nz-year-picker *ngIf="queryType === '1'"
[(ngModel)]="startYear" [nzDisabledDate]="disabledStartYear" (ngModelChange)="onChangeStartYear($event)"
nzPlaceHolder="開始時間" (nzOnOpenChange)=" handleStartOpenChangeYear($event)">
</nz-year-picker>
<nz-month-picker *ngIf="queryType === '2' || queryType === '3'"
" [(ngModel)]="startMonth" tart
(ngModelChange)="onChangeStartMonth($event)" [nzDisabledDate]="disabledStartMonth" nzPlaceHolder="開始時間"
(nzOnOpenChange)=" handleStartOpenChangeMonth($event)">
</nz-month-picker>
<nz-week-picker *ngIf="queryType === '4'"
nzPlaceHolder="開始時間" [(ngModel)]="startWeek" (ngModelChange)="onChangeStartWeek($event)"
[nzDisabledDate]="disabledStartWeek" (nzOnOpenChange)=" handleStartOpenChangeWeek($event)">
</nz-week-picker>
<nz-date-picker *ngIf="queryType === '5'"
nzPlaceHolder="開始時間" [(ngModel)]="startDate" (ngModelChange)="onChangeStartDate($event)"
[nzDisabledDate]="disabledStartDate" (nzOnOpenChange)=" handleStartOpenChangeDate($event)">
</nz-date-picker>
~
<nz-year-picker *ngIf="queryType === '1'"
[(ngModel)]="endYear" [nzDisabledDate]="disabledEndYear" (ngModelChange)="onChangeEndYear($event)"
nzPlaceHolder="結束時間" class="margin7">
</nz-year-picker>
<nz-month-picker *ngIf="queryType === '2' || queryType === '3'"
[nzSize]="appService.formInputSize" [(ngModel)]="endMonth" tart (ngModelChange)="onChangeEndMonth($event)"
[nzDisabledDate]="disabledEndMonth" nzPlaceHolder="結束時間" class="margin7">
</nz-month-picker>
<nz-week-picker *ngIf="queryType === '4'"
nzPlaceHolder="結束時間" [(ngModel)]="endWeek" (ngModelChange)="onChangeEndWeek($event)"
[nzDisabledDate]="disabledEndWeek" class="margin7">
</nz-week-picker>
<nz-date-picker *ngIf="queryType === '5'"
nzPlaceHolder="結束時間" [(ngModel)]="endDate" (ngModelChange)="onChangeEndDate($event)"
[nzDisabledDate]="disabledEndDate" class="margin7">
</nz-date-picker>
.ts:這里代碼代碼比較多,但是方法是一樣的,就用年份選擇器演示,其余的選擇器根據綁定的方法更改一下綁定值就行了。唯一區別:年、月選擇器起始時間默認展示去年,周、日選擇器起始時間默認展示上月。
isFirstYear: boolean = true;
isFirstMonth: boolean = true;
isFirstWeek: boolean = true;
isFirstDate: boolean = true;
/**
* 年份選擇器綁定
*/
startYear: any = null;
endYear: any = null;
startMonth: any = null;
endMonth: any = null;
startWeek: any = null;
endWeek: any = null;
startDate: any = null;
endDate: any = null;
/*******************************下面這段用於時間選擇器的聯動邏輯控制************************************ */
/**
* 開始日期數據變動
*/
onChangeStartYear(date: Date): void {
this.startYear = date;
this.isFirstYear = false;
if (!date) {
this.isFirstYear = true;
}
}
/**
* 結束日期數據變動
*/
onChangeEndYear(date: Date): void {
this.endYear = date;
}
/**
* 設置開始年份選擇器不可選擇范圍
*/
disabledStartYear = (startYear: Date): boolean => {
if (!startYear || !this.endYear) {
return differenceInCalendarDays(startYear, new Date()) > 0;
}
return startYear.getTime() > this.endYear.getTime();
}
/**
* 設置結束年份選擇器不可選擇范圍
*/
disabledEndYear = (endYear: Date): boolean => {
if (!endYear || !this.startYear) {
return differenceInCalendarDays(endYear, new Date()) > 0;
}
return endYear.getTime() <= this.startYear.getTime() || differenceInCalendarDays(endYear, new Date()) > 0;
}
/**
*
* 年份選擇器打開的時候控制選擇的年份為去年
* @param {*} e
* @memberof FinaFlowStatComponent
*/
handleStartOpenChangeYear(e: any): void {
// isFirst用於判斷是否第一次打開日期面板
if (e && this.isFirstYear === true) {
setTimeout(() => {
const pre: any = document.getElementsByClassName('ant-calendar-year-panel-prev-decade-btn');
pre[0].click();
}, 0);
setTimeout(() => { // 這一段一定要注意,不然會是第一個上翻a標簽觸發兩次。
const next: any = document.getElementsByClassName('ant-calendar-year-panel-prev-decade-btn');
if (next[1]) {
next[1].click();
}
}, 10);
}
}
//其余省略
/************* */
/*******************************上面這段用於時間選擇器的聯動邏輯控制************************************ */
增加一個日期起始時間打開
/**
* 日期選擇器打開的時候控制選擇的日期為上月日期
*
* @param {*} e
* @memberof FinaFlowStatComponent
*/
handleStartOpenChangeDate(e: any): void {
// isFirstDate用於判斷是否第一次打開日期面板
if (e && this.isFirstDate === true) {
setTimeout(() => {
const pre: any = document.getElementsByClassName('ant-calendar-prev-month-btn');
pre[0].click();
}, 0);
setTimeout(() => { // 這一段一定要注意,不然會是第一個上翻a標簽觸發兩次。
const next: any = document.getElementsByClassName('ant-calendar-prev-month-btn');
if (next[1]) {
next[1].click();
}
}, 10);
}
}
到這里就差不多結束了,代碼是空閑時從項目里整理出來的然后刪除了一些東西,簡化了一些東西,如果有問題歡迎留言指出,我會進行更正。
成長是一步一步的,可能會很low,但是會越來越好的。
