[英]How to remove disabled years from material datepicker?
有点hack,但是由于这都是HTML,您可以做的是创建一个自定义指令以从您的HTML中删除这些项目。
创建指令:
import {
AfterViewInit,
Directive,
ElementRef,
Renderer2
} from '@angular/core';
import { MatCalendarView, MatDatepicker } from '@angular/material/datepicker';
@Directive({
selector: '[disabledDates]',
})
export class DisabledDates implements AfterViewInit {
constructor(
private ref: ElementRef,
private datePicker: MatDatepicker<any>,
private rn: Renderer2
) {}
ngAfterViewInit() {
console.log('datepicker: ', this.datePicker);
this.datePicker._viewChanged = this.onChangesForPicker.bind(this);
}
private onChangesForPicker(view: MatCalendarView) {
console.log('Simple changes: ', view == 'multi-year');
if (view == 'multi-year') {
let items = document.getElementsByClassName(
'mat-calendar-body-cell mat-calendar-body-disabled'
);
let arrayOfItems = Array.from(items);
if (arrayOfItems && arrayOfItems.length)
arrayOfItems.forEach((x) => {
this.rn.removeChild(this.ref, x);
});
}
}
}
这样做是利用datePickers
的_viewChanged
的私有方法。 如果视图是multi-year
类型,那么我们知道我们正在查看我们选择的可用年份。
然后它所做的是使用document
,它将获取 class 名称暗示它们被禁用的所有元素。 从那里它调用渲染器并告诉它从父组件中删除这些子组件。 在这种情况下,父组件是日期选择器。
在您的 HTML 中,您将通过将此指令应用于 mat-datepicker 本身来使用此指令,如下所示:
<mat-datepicker #picker disabledDates></mat-datepicker>
工作堆栈闪电战:
https://stackblitz.com/edit/angular-8dzujz?file=src/app/disabled-dates.directive.ts
编辑:Angular 中的指令是一个强大的工具,可帮助您创建各种自定义行为,以及扩展代码或利用您无法直接访问的单独组件的底层 HTML 的方法(例如:Mat Datepicker)
编辑2:
.bind(this)
是必需的,因为在 JS 中this
是一个非常奇怪和不幸的生物。 如果没有绑定,如果您尝试在该方法中调用可以使用this
访问的元素,它将引发未定义的错误,因为它的this
版本与属于指令本身的this
不同。 因此,以这种方式绑定它使得任何时候我们在该方法中使用this
(请注意,如果您不这样做,智能感知不会抱怨)是您指令的实际this
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.