我可以添加快捷键以在 Angular Material 日期选择器字段中输入日期吗?
Can I add accelerators to enter a date in a Angular Material Datepicker field?
我正在使用 Angular 开发 Web 应用程序。有没有办法将 shortcuts/accelerators 添加到日期输入?例如,用户应该能够键入“+1”并将输入解析为明天的日期。至少我希望能够将“6-18”的输入设置为 6-18-2020 而不是 6-18-2001。
我正在使用 Angular 9 和 Material 8。
这是我解决这个问题的方法,以防其他人遇到同样的问题。这使得可以通过 +1(明天)、-1(昨天)等输入日期。
我创建了一个指令...
export class DateEntryShortcutsDirective {
// form control bound to datepicker input
@Input() control: FormControl;
constructor() {}
// listen for change events on the datepicker input
@HostListener('change', ['$event']) onChange(event: any) {
this.setDate(event.target.value);
}
setDate(data) {
if (typeof data === 'string' && data.length) {
// if values begins with '+'
if (data.substring(0, 1) === '+') {
// get current date and advance by however many days requested
const dayDiff = +data.substring(1);
const date = new Date(
new Date().getTime() + dayDiff * 24 * 60 * 60 * 1000
);
// set the control value to date
if (this.control) {
this.control.setValue(date);
}
} else if (data.substring(0, 1) === '-') {
// if value begins with '-'
// get current day and subtract days
const dayDiff = +data.substring(1);
const date = new Date(
new Date().getTime() - dayDiff * 24 * 60 * 60 * 1000
);
// set control to date
if (this.control) {
this.control.setValue(date);
}
}
}
}
}
然后像这样使用指令...
<mat-form-field class="mat-form-field date items">
<mat-label>Deliver NLT</mat-label>
<input
tabindex="{{ 80 + index * 1500 }}"
matInput
autocomplete="off"
[matDatepicker]="receiverNLTDate"
placeholder="Date NLT"
formControlName="receiverNoLaterThanDate"
(dateChange)="onReceiverNoLaterThanChanges()"
[min]="
this.data.reference.freightUnits[this.index]
.receiverRequestedDeliveryDate
"
appDateEntryShortcuts
[control]="receiverNoLaterThanDate"
/>
<mat-datepicker-toggle
matSuffix
[for]="receiverNLTDate"
></mat-datepicker-toggle>
<mat-datepicker #receiverNLTDate></mat-datepicker>
编辑
在获得更多理解之后,我现在扩展 Native Date Adapter
并用我自己的解析函数覆盖它。
我正在使用 Angular 开发 Web 应用程序。有没有办法将 shortcuts/accelerators 添加到日期输入?例如,用户应该能够键入“+1”并将输入解析为明天的日期。至少我希望能够将“6-18”的输入设置为 6-18-2020 而不是 6-18-2001。
我正在使用 Angular 9 和 Material 8。
这是我解决这个问题的方法,以防其他人遇到同样的问题。这使得可以通过 +1(明天)、-1(昨天)等输入日期。
我创建了一个指令...
export class DateEntryShortcutsDirective {
// form control bound to datepicker input
@Input() control: FormControl;
constructor() {}
// listen for change events on the datepicker input
@HostListener('change', ['$event']) onChange(event: any) {
this.setDate(event.target.value);
}
setDate(data) {
if (typeof data === 'string' && data.length) {
// if values begins with '+'
if (data.substring(0, 1) === '+') {
// get current date and advance by however many days requested
const dayDiff = +data.substring(1);
const date = new Date(
new Date().getTime() + dayDiff * 24 * 60 * 60 * 1000
);
// set the control value to date
if (this.control) {
this.control.setValue(date);
}
} else if (data.substring(0, 1) === '-') {
// if value begins with '-'
// get current day and subtract days
const dayDiff = +data.substring(1);
const date = new Date(
new Date().getTime() - dayDiff * 24 * 60 * 60 * 1000
);
// set control to date
if (this.control) {
this.control.setValue(date);
}
}
}
}
}
然后像这样使用指令...
<mat-form-field class="mat-form-field date items">
<mat-label>Deliver NLT</mat-label>
<input
tabindex="{{ 80 + index * 1500 }}"
matInput
autocomplete="off"
[matDatepicker]="receiverNLTDate"
placeholder="Date NLT"
formControlName="receiverNoLaterThanDate"
(dateChange)="onReceiverNoLaterThanChanges()"
[min]="
this.data.reference.freightUnits[this.index]
.receiverRequestedDeliveryDate
"
appDateEntryShortcuts
[control]="receiverNoLaterThanDate"
/>
<mat-datepicker-toggle
matSuffix
[for]="receiverNLTDate"
></mat-datepicker-toggle>
<mat-datepicker #receiverNLTDate></mat-datepicker>
编辑
在获得更多理解之后,我现在扩展 Native Date Adapter
并用我自己的解析函数覆盖它。