angular - Angular Material datepicker 在日单元格中带有自定义文本
问题描述
我正在寻找构建一个角度材料日期选择器(Angular Material 11),但我有一个需要的小功能,我似乎无法破解。
它需要如下图所示:
我遇到的问题是出现在每个日单元格中的额外文本。我试过 [dateClass] 属性但无济于事:
模板:
<mat-datepicker [dateClass]="dateClassArrow"></mat-datepicker>
.ts 组件:
constructor(availableItemsService...) {}
dateClassArrow = date => {
const noItems: string = this.availableItemsService.getAvailableItems(date);
document.documentElement.style.setProperty('--availableItems', noItems);
return 'class-that-contains-content';
}
.scss
:root {
--availableItems: 1;
}
.class-that-contains-content {
...
}
.class-that-contains-content:before {
content: --availableItems;
}
也试过没有:before,比如
.class-that-contains-content {
content: attr(--availableMaterials);
}
任何提示或帮助将不胜感激。
解决方案
我阅读了这些博客,以了解如何做到这一点。
https://blog.angular.io/taking-advantage-of-the-angular-material-datepicker-237e80fa14b3 ,
第二个有一个很好的实现,可以为特定日期的背景添加颜色变化。
我最终这样做了:
这是我的 .ts 文件:
import { Component, AfterViewInit, ViewChild, Renderer2 } from '@angular/core';
import { MatCalendar } from '@angular/material/datepicker';
import { Moment } from 'moment';
@Component({
selector: 'calendar',
templateUrl: './calendar.component.html',
styleUrls: ['./calendar.component.css']
})
export class CalendarComponent implements AfterViewInit {
@ViewChild('calendar') calendar: MatCalendar<Moment>;
selectedDate: Moment;
constructor(private _renderer: Renderer2) {
}
ngAfterViewInit() {
const monthPrevBtn = document.querySelectorAll('.mat-calendar-previous-button');
const monthNextBtn = document.querySelectorAll('.mat-calendar-next-button');
if (monthPrevBtn) {
Array.from(monthPrevBtn).forEach((button) => {
this._renderer.listen(button, 'click', (event) => {
this.updateCalendar();
});
});
}
if (monthNextBtn) {
Array.from(monthNextBtn).forEach((button) => {
this._renderer.listen(button, 'click', (event) => {
this.updateCalendar();
});
});
}
this.updateCalendar();
}
handleMonthSelected(event) {
this.updateCalendar();
}
updateCalendar() {
setTimeout(() => {
const cells = Array.from(document.querySelectorAll<HTMLDivElement>('.mat-calendar .mat-calendar-body-cell-content'));
cells.forEach(c => {
c.innerText = c.innerText.length == 1 ? '0' + c.innerText : c.innerText;
c.innerHTML = '<div class="row"><div class="col-12" style="font-size:1.5em;">' + c.innerText + '</div><div class="col-12">' + 1 + '</div></div>';//TODO: check date and data and use number from that.
});
});
}
}
这是我的html:
<div class="calendar-wrapper">
<mat-calendar (monthSelected)="handleMonthSelected($event)" #calendar [(selected)]="selectedDate">
</mat-calendar>
</div>
即使您更改月份,这也将处理格式化日历。
推荐阅读
- c# - 如何在 WPF 后面的代码中获取“ContentPresenter”中的数据?
- sql - 正则表达式提取(字符串的左侧部分来自 1 之前的 1 个下划线)
- sql - 如何将 Mysqli NESTED JOIN 查询转换为活动记录
- javascript - socket io 事件触发多次
- reactjs - 基本身份验证登录弹出窗口未显示
- performance - 如何解决“Admob 离线性能问题”?
- c# - 尝试从 QBO API 获取超过 1000 个客户和发票时出现异常
- sql - 填补表格中缺失的天数
- python - 如何在字典理解中创建某些值的元组?
- unity3d - Unity 3D - 无法签署 APK - 虽然我提供了正确的密钥库和密码