您需要创建一个扩展 NativeDateAdapter 的类(来自“@angular/material/core”)
如果您覆盖格式功能,您将在选择日期后更改日期在输入中的显示方式。
手动编辑输入值时会调用 parse 函数,以显示有效日期。
更多详情见第二条评论:https://github.com/angular/material2/issues/5722
编辑:
我找不到格式化输出的方法,因此我将材料日期选择器组件包装到自定义组件中。
这个自定义组件在属性上有 2 种方式绑定来获取日期:
@Input() selectedValue 和 @Output() selectedValueChange: EventEmitter<any> = new EventEmitter<any>();
在 ngInit 上设置了 private _selectedValue;,它将包含 datepicker 日期。
然后在模板中,html datepicker输入元素有[(ngModel)]="_selectedValue" (dateChange)="onChange($event)"
onChange 函数获取日期选择器值_selectedValue,对其进行格式化并将其发送到selectedValueChange。
最终组件如下所示:
import { Component, OnInit, Input, Output, EventEmitter } from "@angular/core";
import {
DateAdapter,
NativeDateAdapter,
MAT_DATE_FORMATS,
MAT_DATE_LOCALE
} from "@angular/material/core";
import * as moment from "moment";
const CUSTOM_DATE_FORMATS = {
parse: {
dateInput: { month: "short", year: "numeric", day: "numeric" }
},
display: {
dateInput: "input",
monthYearLabel: { year: "numeric", month: "short" },
dateA11yLabel: { year: "numeric", month: "long", day: "numeric" },
monthYearA11yLabel: { year: "numeric", month: "long" }
}
};
const dateFormat = "YYYY-MM-DD";
// date adapter formatting material2 datepickers label when a date is selected
class AppDateAdapter extends NativeDateAdapter {
format(date: Date, displayFormat: Object): string {
if (displayFormat === "input") {
return moment(date).format(dateFormat);
} else {
return date.toDateString();
}
}
}
@Component({
selector: "datepicker",
templateUrl: "./datepicker.component.html",
styleUrls: ["./datepicker.component.scss"],
providers: [
{ provide: MAT_DATE_FORMATS, useValue: CUSTOM_DATE_FORMATS },
{ provide: DateAdapter, useClass: AppDateAdapter }
]
})
export class DatepickerComponent implements OnInit {
@Input() placeholder;
@Output() onFilter: EventEmitter<any> = new EventEmitter<any>();
@Input() selectedValue;
@Output() selectedValueChange: EventEmitter<any> = new EventEmitter<any>();
private _selectedValue;
constructor() {}
ngOnInit() {
this._selectedValue = this.selectedValue;
}
onChange($event) {
this.selectedValue = this.updateDate($event.value);
this.onFilter.emit(this.selectedValue);
}
updateDate(date) {
let formatedDate;
if (date !== undefined) {
formatedDate = moment(date).format(dateFormat);
}
this.selectedValueChange.emit(formatedDate);
return formatedDate;
}
}