有没有办法自定义 angular 日期选择器?
Is there a way to customize angular date picker?
我需要帮助来自定义 angular material 日期选择器,即 https://material.angular.io/components/datepicker/overview。
单击日期后,日历不应关闭。我应该可以有 2 个按钮,一个是 'cancel',另一个是 'save'。单击保存按钮后,应关闭日历。
我不知道这是否是更好的解决方案,但基于此,我认为解决方案是使用一个带有日历的菜单。
因为我们需要一个输入,所以我们至少需要两个函数,一个用于将输入值解析为日期对象,另一个用于在我们有日期对象时格式化输入值。
因为我想要这个 "special" 日期选择器可以用多种方式格式化日期,YYYY-MM-DD 和 DD/MM/YYYY 我需要树变量
placeHolder:string="DD/MM/YYYY"
separator:string;
order:number[]=[];
一个函数给我们 "separator and order"
的值
init(placeholder:string)
{
this.separator=placeholder.replace(/[YMD]/g,'').substr(0,1)
const parts=placeholder.replace(/[.\/]/g,'-').split('-')
this.order[0]=parts.indexOf('YYYY')
this.order[1]=parts.indexOf('MM')
this.order[2]=parts.indexOf('DD')
}
所以,我们的函数解析和格式变成了
format(date:any)
{
if (!date)
return null;
const parts=[''+date.getFullYear(),
("00" + (date.getMonth() + 1)).slice(-2),
("00" + date.getDate()).slice(-2)]
return parts[this.order[0]]+this.separator+
parts[this.order[1]]+this.separator+
parts[this.order[2]]
}
parse(value:string)
{
const parts=value?value.replace(/[.\/]/g,'-').split('-'):[]
const date:any=(parts.length==3)?
new Date(parts[this.order[0]]+'-'+parts[this.order[1]]+'-'+parts[this.order[2]]):
null
return date && date.getTime && date.getTime()?date:null
}
辅助函数允许我们(模糊)重新格式化值
tryFormat(value:string)
{
const date=this.parse(value)
this.date=date?this.format(date):value
}
还有一个函数,当"menu"打开时,允许更改在ViewChild
中获取的日历的活动日期
@ViewChild('calendar',{static:false}) calendar:any
onOpen()
{
if (this.date)
{
const date=this.parse(this.date);
if (date)
{
this.calendar.activeDate=date;
}
}
}
最后,.html就像
<mat-form-field class="example-full-width">
<mat-label>Date</mat-label>
<input matInput placeholder="{{placeHolder}}" [(ngModel)]="date" (blur)="tryFormat(date)" >
<button matSuffix mat-icon-button [matMenuTriggerFor]="appMenu" (menuOpened)="onOpen()">
<mat-icon>calendar_today</mat-icon>
</button>
</mat-form-field>
<mat-menu #appMenu="matMenu" class="drop-calendar" >
<div (click)="$event.stopPropagation()">
<mat-calendar #calendar
(selectedChange)="date=format($event)"
[selected]="parse(date)">
</mat-calendar>
</div>
</mat-menu>
完整代码在stackblitz
我需要帮助来自定义 angular material 日期选择器,即 https://material.angular.io/components/datepicker/overview。 单击日期后,日历不应关闭。我应该可以有 2 个按钮,一个是 'cancel',另一个是 'save'。单击保存按钮后,应关闭日历。
我不知道这是否是更好的解决方案,但基于此
因为我们需要一个输入,所以我们至少需要两个函数,一个用于将输入值解析为日期对象,另一个用于在我们有日期对象时格式化输入值。
因为我想要这个 "special" 日期选择器可以用多种方式格式化日期,YYYY-MM-DD 和 DD/MM/YYYY 我需要树变量
placeHolder:string="DD/MM/YYYY"
separator:string;
order:number[]=[];
一个函数给我们 "separator and order"
的值 init(placeholder:string)
{
this.separator=placeholder.replace(/[YMD]/g,'').substr(0,1)
const parts=placeholder.replace(/[.\/]/g,'-').split('-')
this.order[0]=parts.indexOf('YYYY')
this.order[1]=parts.indexOf('MM')
this.order[2]=parts.indexOf('DD')
}
所以,我们的函数解析和格式变成了
format(date:any)
{
if (!date)
return null;
const parts=[''+date.getFullYear(),
("00" + (date.getMonth() + 1)).slice(-2),
("00" + date.getDate()).slice(-2)]
return parts[this.order[0]]+this.separator+
parts[this.order[1]]+this.separator+
parts[this.order[2]]
}
parse(value:string)
{
const parts=value?value.replace(/[.\/]/g,'-').split('-'):[]
const date:any=(parts.length==3)?
new Date(parts[this.order[0]]+'-'+parts[this.order[1]]+'-'+parts[this.order[2]]):
null
return date && date.getTime && date.getTime()?date:null
}
辅助函数允许我们(模糊)重新格式化值
tryFormat(value:string)
{
const date=this.parse(value)
this.date=date?this.format(date):value
}
还有一个函数,当"menu"打开时,允许更改在ViewChild
中获取的日历的活动日期@ViewChild('calendar',{static:false}) calendar:any
onOpen()
{
if (this.date)
{
const date=this.parse(this.date);
if (date)
{
this.calendar.activeDate=date;
}
}
}
最后,.html就像
<mat-form-field class="example-full-width">
<mat-label>Date</mat-label>
<input matInput placeholder="{{placeHolder}}" [(ngModel)]="date" (blur)="tryFormat(date)" >
<button matSuffix mat-icon-button [matMenuTriggerFor]="appMenu" (menuOpened)="onOpen()">
<mat-icon>calendar_today</mat-icon>
</button>
</mat-form-field>
<mat-menu #appMenu="matMenu" class="drop-calendar" >
<div (click)="$event.stopPropagation()">
<mat-calendar #calendar
(selectedChange)="date=format($event)"
[selected]="parse(date)">
</mat-calendar>
</div>
</mat-menu>
完整代码在stackblitz