我阻止覆盖关闭的方法是更改 MatCalendar._userSelected方法。
如果您查看 MatDatePickerContent 的模板,您会注意到发出_userSelection时的调用。调用是关闭覆盖:(_userSelection)="datepicker.close()"
。现在,_userSelection在MatCalendar._userSelected中发出。
datepicker.js,第 1687 行,“@angular/material”:“8.2.3”:
_userSelected() {
this._userSelection.emit();
}
因为我不希望应用程序中的所有 DatePicker 实例都有这种行为,所以在我的组件中我执行了以下操作:
@ViewChild('picker', { static: true })
private picker: MatDatepicker<Date>;
private preventCloseOnSelection = true;
private readonly initCalendarUserSelected: () => void;
public model: Array<Date>;
constructor(private readonly cdr: ChangeDetectorRef) {
this.initCalendarUserSelected = MatCalendar.prototype._userSelected;
}
public ngAfterViewInit() {
this.picker.calendarHeaderComponent = CalendarTimeHeaderComponent;
this.picker.openedStream
.pipe(takeUntil(this.isUnsubscribing))
.subscribe(() => {
if (this.preventCloseOnSelection) {
MatCalendar.prototype._userSelected = () => {};
} else {
MatCalendar.prototype._userSelected = this.initCalendarUserSelected;
}
this.cdr.detectChanges();
});
}
public ngOnDestroy() {
MatCalendar.prototype._userSelected = this.initCalendarUserSelected;
}
如果您希望日期选择器的所有实例都具有此行为,则可以在 AppComponent 中的某处覆盖MatCalendar._userSelected方法,而不必费心恢复它。
另一种方法是this.picker.close = () => { };
在日期更改后执行,但您必须始终恢复它才能关闭覆盖。
您可以使用matDatepickerInput 的 dateChange事件获取选定的日期,并创建一个包含多个值的日期的数组,并在视图中选择它们,您可以使用matDatepicker的dateClass输入。
看法:
<input [(ngModel)]="model" matInput [matDatepicker]="picker" placeholder="Choose a date" (dateChange)="dateChanged($event)" />
<mat-datepicker-toggle matPrefix [for]="picker"></mat-datepicker-toggle>
<mat-datepicker #picker [dateClass]="dateClass"></mat-datepicker>
方法:
public dateClass = (date: Date) => {
if (this.model.map((m) => +m).indexOf(+date) !== -1) {
return [ 'selected' ];
}
return [ ];
}
public dateChanged(event: MatDatepickerInputEvent<Date>) {
if (event.value) {
const date = event.value;
const index = this.model.map((m) => +m).indexOf(+date);
if (index === -1) {
this.model.push(date);
} else {
this.model.splice(index, 1)
}
}
}