You're defining a fixed MY_FORMAT, but you can define a class like
export class MyFormat{
value=1;
constructor(){}
get display(){
return this.value==1?
{
dateInput: 'LL',
monthYearLabel: 'MMM YYYY',
dateA11yLabel: 'LL',
monthYearA11yLabel: 'MMMM YYYY',
}:{
dateInput: 'DD/MM/YYYY',
monthYearLabel: 'MM YYYY',
dateA11yLabel: 'DD/MM/YYYY',
monthYearA11yLabel: 'MM YYYY',
}
}
get parse(){
return this.value==1?{
dateInput: 'LL',
}:{
dateInput: 'DD/MM/YYYY'
}
}
}
Then in provider you use this class
providers: [
{provide: MAT_DATE_FORMATS, useClass: MyFormat},
],
Finally, you inject in contructor of your component the provider to access to the variable "value"
constructor(@Inject(MAT_DATE_FORMATS) public config: MyFormat){}
Well, you need, when change the format "redraw" the dateForm, e.g.
change(){
this.config.value=this.config.value==1?2:1 //we change the "value"
this.date=new FormControl(this.date.value) //give the value
}
But, be carefully, you need use a CustomDateAdapter or use the MomentDateAdapter
Using a MomentDateAdapter it's import in the module MomentDateModule
@NgModule({
imports: [
...
MomentDateModule,
],
If you want to use a CustomDateAdapter you can use some like
export class CustomDateAdapter extends NativeDateAdapter {
formato="YYY/MM/DD"
parse(value: any) {
const parts = value.match(/\d{1,4}/g);
if (parts && parts.length == 3) {
const order = this.formato.match(/Y{2,4}|M{1,2}|D{1,2}/g);
if (order) {
const year = +parts[
order.indexOf("YYYY") < 0
? order.indexOf("YY")
: order.indexOf("YYYY")
];
const month = +parts[
order.indexOf("MM") < 0 ? order.indexOf("M") : order.indexOf("MM")
];
const day = +parts[
order.indexOf("DD") < 0 ? order.indexOf("D") : order.indexOf("DD")
];
return new Date(year<100?year+2000:year, month - 1, day);
}
}
return null;
}
format(date: any, displayFormat: any): string {
if (displayFormat=="MMM YYYY")
return this.getMonthNames('long')[date.getMonth()]+' '+date.getFullYear()
const result= displayFormat
.replace("YYYY", date.getFullYear())
.replace("YY", date.getYear())
.replace("MMM", this.getMonthNames('long')[date.getMonth()])
.replace("MM", ("00" + (date.getMonth() + 1)).slice(-2))
.replace("M", date.getMonth() + 1)
.replace("DD", ("00" + date.getDate()).slice(-2))
.replace("M", date.getDate())
return result;
}
}
And you inject in constructor the adapter adn cahnge the "formato" value
constructor(@Inject(MAT_DATE_FORMATS) private config: MyFormat,
@Inject(DateAdapter) private customDateAdapter:CustomDateAdapter) {
this.config.value = 1;
this.customDateAdapter.formato='YYYY/MM/DD'
}
change() {
this.config.value = this.config.value == 1 ? 2 : 1;
this.customDateAdapter.formato=this.config.value==1?'DD/MM/YYYY' : 'YYYY/MM/DD';
this.date = new FormControl(this.date.value);
}
You can see a stackblitz using MomentAdapter
You can see a stackblitz using CustomDateAdapter