【问题标题】:Angular Material Date Picker isn't using the specified Custom Date FormatAngular Material Date Picker 未使用指定的自定义日期格式
【发布时间】:2021-08-27 01:12:01
【问题描述】:

我似乎无法让 Material Datepicker 接受我提供的格式。我想将日期格式化为 YYYY-MM-DD,但它坚持使用 M/D/YYYY。

下面是我正在重现该问题的堆栈闪电战。此外,它会将之前选择的日期放在 HTML 页面的底部,看起来是不请自来的。

Stackblitz 的图片如下:

我正在自定义它,如许多不同的教程和文档所示:

export const MY_DATE_FORMATS = {
    parse: {
      dateInput: 'YYYY-MM-DD',
    },
    display: {
      dateInput: 'YYYY-MM-DD',
      monthYearLabel: 'MMM YYYY',
      dateA11yLabel: 'LL',
      monthYearA11yLabel: 'MMMM YYYY'
    },
  };

我将它包含在我的 module.ts 文件中:

providers: [
    {provide: MAT_DATE_FORMATS, useValue: MY_DATE_FORMATS}
  ]

我也尝试用 NativeDateModule 替换 MatNativeDateModule:

imports:      [ 
BrowserModule, 
FormsModule,
MatDatepickerModule,  
NativeDateModule,    
BrowserAnimationsModule],

下面是我的 Stackblitz URL 重现该问题: https://stackblitz.com/edit/angular-ivy-bfjsid?file=src/app/app.module.ts

在这个例子中,如果我选择一个日期,它会将它放在输入框中的 M/D/YYYY 中。此外,它将先前的值放在页面底部,即使我没有任何引用它。

我还试图通过故意弄乱它来确保使用日期格式类,并且材料如我所愿地抱怨。

有人可以看看吗?

提前谢谢你。

【问题讨论】:

标签: angular angular-material datepicker


【解决方案1】:

问题 1:无法将日期格式化为 YYYY-MM-DD

解决方案:

您需要Angular Material Moment Adapter 来格式化日期选择器中的日期。

第 1 步:

npm install @angular/material-moment-adapter

第 2 步:

  1. 在导入中添加 NativeDateModule
  2. 在提供程序中添加 MomentDateAdapter

app.module.ts

import { DateAdapter, MAT_DATE_FORMATS, MAT_DATE_LOCALE, NativeDateModule } from '@angular/material/core';
import { MAT_MOMENT_DATE_ADAPTER_OPTIONS, MomentDateAdapter } from '@angular/material-moment-adapter';

@NgModule({
  imports: [
    ...
    MatDatepickerModule,
    NativeDateModule,
  ],
  declarations: [...],
  bootstrap: [...],
  providers: [
    {
      provide: DateAdapter,
      useClass: MomentDateAdapter,
      deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS]
    },
    { provide: MAT_DATE_FORMATS, useValue: MY_DATE_FORMATS }
  ]
})
export class AppModule {}

问题 2:先前选择的值显示在页面底部

解决方案:

如果不需要,您可以在全局 css 中添加此 CSS 样式规则以隐藏 .cdk-visually-hidden 元素。

.cdk-visually-hidden {
  display: none;
}

Sample project in StackBlitz

【讨论】:

  • 谢谢Yong,我的做法是不是有问题?我很惊讶该组件完全忽略了 MY_DATE_FORMATS,但是直到现在我才使用它,而且很多文档都说要这样做,显然无济于事。
  • 嗨,从您的源代码中,您缺少@angular/material-moment-adapter 及其在app.module.ts 中的相关导入和提供程序。完成上述步骤后,您将能够看到日期选择器已格式化。你可以参考这个docs
【解决方案2】:

您需要在提供程序中添加日期适配器才能使格式正常工作。 安装依赖@angular/material-moment-adapter

import { MomentDateAdapter, MAT_MOMENT_DATE_ADAPTER_OPTIONS } from '@angular/material-moment-adapter';
{
      provide: DateAdapter,
      useClass: MomentDateAdapter,
      deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS]
}

STackblitz 链接:https://stackblitz.com/edit/angular-ivy-w1pdob?file=src%2Fapp%2Fhello.component.ts

【讨论】:

    【解决方案3】:

    您的代码中唯一缺少的是将 MomentDateAdapter 作为模块中的提供程序注入。

        {
          provide: DateAdapter,
          useClass: MomentDateAdapter,
          deps: [MAT_DATE_LOCALE, MAT_MOMENT_DATE_ADAPTER_OPTIONS]
        },
    

    datepicker 期望的值类型取决于提供的 DateAdapter 的类型。在“设置选定日期”部分下的https://material.angular.io/components/datepicker/overview 阅读更多相关信息,您可以根据此https://material.angular.io/components/datepicker/overview#choosing-a-date-implementation-and-date-format-settings 决定日期实施和日期格式设置。

    文档有。 :)

    【讨论】:

    • 我认为让我印象深刻的是 Moment 部分,因为它们支持 Native。在不切入 Moment 的情况下,我想知道我是否需要教条地使用 moment,因为这是唯一真正有效的东西,或者我是否可以让 Native 工作 - 似乎没有 MAT_NATIVE_DATE_ADAPTER_OPTIONS。跨度>
    • 所以,如果我理解正确 - 你不想使用 Moment,你也不需要。但是您必须提供您的自定义适配器实现。我刚刚进行了一些更改并创建了一个自定义适配器,它将以您提到的格式解析日期。在这里找到它 - stackblitz.com/edit/…。并删除了 MomentDateAdapter 的使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多