我找到了解决这个问题的方法。虽然我不确定这是否是最好的方法,但我想提供解决方案。
我必须为内联范围日历创建一个新的角度组件:
HTML 架构
<mat-calendar
#calendar
[selected]="selectedRangeValue"
(selectedChange)="selectedChange($event)"
>
</mat-calendar>
打字稿
import {Component, EventEmitter, Input, OnInit, Output, ViewChild} from '@angular/core';
import {
DateRange, DefaultMatCalendarRangeStrategy,
MAT_DATE_RANGE_SELECTION_STRATEGY, MatCalendar,
} from '@angular/material/datepicker';
import {isNullOrUndefined} from '../../util/is-null-or-undefined';
import moment from 'moment';
@Component({
// tslint:disable-next-line:component-selector
selector: 'inline-range-calendar',
templateUrl: './inline-range-calendar.component.html',
styleUrls: ['./inline-range-calendar.component.sass'],
providers: [{
provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
useClass: DefaultMatCalendarRangeStrategy
}]
})
export class InlineRangeCalendarComponent implements OnInit {
@ViewChild(MatCalendar) calendar: MatCalendar<Date>;
@Input() selectedRangeValue: DateRange<Date>;
@Output() selectedRangeValueChange = new EventEmitter<DateRange<Date>>();
ngOnInit(): void {
}
selectedChange($event) {
const m = moment($event);
if (!isNullOrUndefined(this.selectedRangeValue.end)) {
const start = this.selectedRangeValue.start;
// @ts-ignore the parser thinks that this is a date, but it is a moment.js object, so this will work
start.set(m.toObject());
this.selectedRangeValue = new DateRange<Date>(start, undefined);
this.selectedRangeValueChange.emit(this.selectedRangeValue);
} else {
const end = (!isNullOrUndefined(this.selectedRangeValue.end)) ? this.selectedRangeValue.end : moment(m);
// @ts-ignore the parser thinks that this is a date, but it is a moment.js object, so this will work
end.set(m.toObject());
// @ts-ignore the parser thinks that this is a date, but it is a moment.js object, so this will work
this.selectedRangeValue = new DateRange<Date>(this.selectedRangeValue.start, end);
if (this.selectedRangeValue.end < this.selectedRangeValue.start) {
this.selectedRangeValue = new DateRange<Date>(this.selectedRangeValue.end, this.selectedRangeValue.start);
}
this.selectedRangeValueChange.emit(this.selectedRangeValue);
}
}
}
希望这可以帮助某人。