感谢question in stackoverflow,我们可以加入所有人
我真的不喜欢使用 querySelectorAll,但我认为这是唯一的方法,所以去吧
我们有一组选定的日期
dates = [
{ date: "2019-12-01", text: "one text" },
{ date: "2019-12-20", text: "another text" }
];
所以,首先我们要使用 dateClass 来赋予特殊的颜色
dateClass = (d: Date) => {
const dateSearch = this.dateToString(d);
return this.dates.find(f => f.date == dateSearch)
? "example-custom-date-class"
: undefined;
};
我使用辅助函数将日期对象转换为字符串
dateToString(date: any) {
return (
date.getFullYear() +
"-" +
("0" + (date.getMonth() + 1)).slice(-2) +
"-" +
("0" + date.getDate()).slice(-2)
);
}
如果我们的班级是这样的
.example-custom-date-class {
background: orange;
border-radius: 100%;
}
.example-custom-date-class:hover::after {
counter-increment: section;
content:attr(aria-label);
position: absolute;
left: 0;
top: 24px;
min-width: 200px;
border: 1px #aaaaaa solid;
border-radius: 10px;
background-color: #ffffcc;
padding: 12px;
color: #000000;
font-size: 14px;
z-index: 1;
}
我们有一个使用 aria-label 值的“工具提示”。因此,我们将更改 arial 标签。我们有一个函数
displayMonth() {
let elements = document.querySelectorAll(".endDate");
let x = elements[0].querySelectorAll(".mat-calendar-body-cell");
x.forEach(y => {
const dateSearch = this.dateToString(
new Date(y.getAttribute("aria-label"))
);
const data = this.dates.find(f => f.date == dateSearch);
if (data) y.setAttribute("aria-label", data.text);
});
}
我们需要在打开日历和点击导航按钮时调用,所以我们需要使用一些类似
streamOpened(event) {
setTimeout(() => {
let buttons = document.querySelectorAll("mat-calendar .mat-icon-button");
buttons.forEach(btn =>
this.renderer.listen(btn, "click", () => {
setTimeout(() => {
//debugger
this.displayMonth();
});
})
);
this.displayMonth();
});
}
html
<mat-form-field class="example-full-width" >
<input matInput [matDatepicker]="picker" placeholder="Choose a date">
<mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker (opened)="streamOpened($event)" [dateClass]="dateClass" #picker panelClass="endDate" ></mat-datepicker>
</mat-form-field>
还有stackblitz