还有一个解决方法是使用 dateClass
@ViewChild('picker',{static:false}) calendar: MatDatepicker<any>;
setClass() {
return (date: any) => {
if (date.getDate() == 1) this.changeMonth(
{month:date.getMonth()+1,
year:date.getFullYear()
});
};
}
changeMonth(date)
{
console.log(date)
}
你在哪里
<mat-form-field>
<mat-label>Choose a date</mat-label>
<input matInput [matDatepicker]="picker">
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker [dateClass]="setClass()"></mat-datepicker>
</mat-form-field>
见stackblitz
好吧,如果没有充分的理由,没有人有兴趣知道月份何时更改。典型的原因是调用了一个 API,该 API 返回一个包含“特殊”天数并显示在日历中的数组。
要改变这个特殊日子的方面,我们可以认为我们可以使用自己的函数 dateClass 但请记住,我们正在寻找函数执行后的日子 (*)。所以我们需要使用 Renderer2 来添加类。
如果我们收到的数据有点像(看到“天”是一个字符串)
[
{day:'2020-02-06',data:'one'},
{day:'2020-02-16',data:'two'},
{day:'2020-02-22',data:'three'}
]
我们的函数changeMonth变成这样:
changeMonth(date) {
this.dataService.getData(date.month, date.year).subscribe(res => {
setTimeout(() => {
let elements = document.querySelectorAll(".calendar");
if (elements && elements.length) {
const cells = elements[0].querySelectorAll(".mat-calendar-body-cell");
cells.forEach(x => {
const date = new Date(x.getAttribute("aria-label"));
const dateTxt =
date.getFullYear() +
"-" +
("00" + (date.getMonth() + 1)).slice(-2) +
"-" +
("00" + date.getDate()).slice(-2);
if (res.find(x => x.day == dateTxt))
{
this.renderer.addClass(x, "special");
}
});
}
});
});
}
(*) 我们也可以在 ngOnInit 中查询“特殊日子”,然后简单地使用 dateClass 函数