首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >角日期选择-动态更新MAT_DATE_FORMATS

角日期选择-动态更新MAT_DATE_FORMATS
EN

Stack Overflow用户
提问于 2020-04-22 12:00:09
回答 2查看 2.4K关注 0票数 12

我正在一个Angular9应用程序上工作,这个应用程序可以处理日期。它显示和更新几个<mat-datepicker>字段。

我使用的是自定义MAT_DATE_FORMATSMomentDateAdapter (@angular/material-moment-adapter),来自https://www.npmjs.com/package/@angular/material-moment-adapter

我使用了以下代码,运行良好:

代码语言:javascript
运行
复制
export const APP_MOMENT_DATE_FORMATS =
{    
  parse: {},
  display: {
    dateInput: 'YYYY/MM/DD/MM',
    monthYearLabel: 'MMM YYYY',
    dateA11yLabel: 'LL',
    monthYearA11yLabel: 'MMMM YYYY'
  }
};

//..
providers: [
  {
     provide: MAT_DATE_FORMATS, useValue: APP_MOMENT_DATE_FORMATS
  },
  {
    provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE]
  }
]
// ..

Stackblitz演示:https://stackblitz.com/edit/angular-formatted-datepicker-vdtaqj?file=app%2Fdatepicker-overview-example.ts

现在,我想知道是否可以更新APP_MOMENT_DATE_FORMATS.display.dateInput 动态的值-例如:也许它将通过http请求从配置服务中设置,或者我将在接口中显示一个选择器。

示例:

代码语言:javascript
运行
复制
export const APP_MOMENT_DATE_FORMATS =
  {  
    // ..  
    display: {
     dateInput: this.appService.dateInputFormat,
     // ..
   }
  };

我知道我可以实现一个定制的日期适配器,如下所述:角2材料2数据采集数据格式

但我想知道是否有另一种方法可以这样做,而不需要实现新的自定义日期适配器。

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-10-13 15:20:22

在花了几个小时寻找解决方案之后,我提出了以下解决方案,只需简单地注入MAT_DATE_FORMATS并动态地更改它:

代码语言:javascript
运行
复制
const APP_MOMENT_DATE_FORMATS =
{
    parse: {
    dateInput: 'MM/DD/YYYY',
    },
    display: {
    dateInput: 'MM/DD/YYYY',
    monthYearLabel: 'MMM YYYY',
    dateA11yLabel: 'LL',
    monthYearA11yLabel: 'MMMM YYYY'
    }
};

@Component({
...  
providers: [
    {
    provide: MAT_DATE_FORMATS, useValue: APP_MOMENT_DATE_FORMATS
    },
    {
    provide: DateAdapter,
    useClass: MomentDateAdapter,
    deps: [MAT_DATE_LOCALE]
    }
]
})

export class DatePickerComponent implements OnInit, OnDestroy {

constructor(@Inject(MAT_DATE_FORMATS) public data: any) {
    data.parse.dateInput = 'DD/MM/YYYY'
    data.display.dateInput = 'DD/MM/YYYY'
  }
}
票数 4
EN

Stack Overflow用户

发布于 2021-08-09 02:26:21

不太确定如何在运行时更新提供程序的值,但有办法在组件级别为mat-datepicker提供不同的mat-datepicker值。

正如角舵中提到的

同一元素上的组件和指令共享一个注入器。

customPickerFormats指令与不同的MAT_DATE_FORMATS提供程序放在包装mat-datepickermat-form-field中。

在directice.ts中:

代码语言:javascript
运行
复制
import { Directive } from '@angular/core';
import { MAT_DATE_FORMATS } from '@angular/material/core';

@Directive({
  selector: '[appCustomPickerFormats]',
  providers: [
    {
      provide: MAT_DATE_FORMATS,
      useValue: {
        parse: {
          dateInput: 'DD/MM',
        },
        display: {
          dateInput: 'Do MMMM',
          monthYearLabel: 'MMM',
          dateA11yLabel: 'LL',
          monthYearA11yLabel: 'MMMM YYYY',
        },
      },
    },
  ],
})
export class CustomPickerFormatsDirective {}

在component.ts中:

代码语言:javascript
运行
复制
<mat-form-field appCustomPickerFormats>
  <mat-label>Choose a date</mat-label>
  <input matInput [matDatepicker]="customPicker">
  <mat-datepicker-toggle matSuffix [for]="customPicker"></mat-datepicker-toggle>
  <mat-datepicker #customPicker></mat-datepicker>
</mat-form-field>

默认情况下,不带指令的第一个mat-datepicker将使用为HostComponent或组件放置的模块设置的任何MAT_DATE_FORMATS值。

一个工作的堆栈闪电战示例这里

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61364618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档