Angular 9-拡張する方法(ロケール対応の週の始まり)NativeDateAdapterは機能しますか?

Dec 02 2020

ロケールを認識させるために(週の始まりに関して)Material DatePicker私はこの拡張機能を作成しました:

import { Injectable } from "@angular/core";
import { LOCALE_ID, Inject } from "@angular/core";
import { Platform } from "@angular/cdk/platform";
import { getLocaleFirstDayOfWeek } from "@angular/common";
import { NativeDateAdapter } from '@angular/material/core';

@Injectable({providedIn: 'root'})
export class LocaleDateAdapter extends NativeDateAdapter {
  constructor(@Inject(LOCALE_ID) public locale: string) {
    super(locale, new Platform());
  }

  getFirstDayOfWeek() {
    return getLocaleFirstDayOfWeek(this.locale);
  }
}

また、0 argsコンストラクターを使用して、週の最初の日として常に1を再調整してみました。一部の同僚はそれ{providedIn: 'root'}が役立つかもしれないと言いました-それはしませんでした。

私はそれapp.module.tsをプロバイダーとしてフックしました:

{
  provide: DateAdapter,
  useClass: LocaleDateAdapter
}

私のDatePickerは次のように設定されています:

<mat-form-field appearance="fill">
  <mat-label>set date</mat-label>
  <input matInput [matDatepicker]="picker1" (dateChange)="onDateChange($event)" [formControl]=formDate>
  <mat-datepicker-toggle matSuffix [for]="picker1"></mat-datepicker-toggle>
  <mat-datepicker [startAt]="filter.date"  #picker1></mat-datepicker>
</mat-form-field>

問題は、LocaleDateAdapterがインスタンス化されておらず(ブレークポイントがヒットしていない)、週の始まりが変更されていないことです。月曜日に変更する必要があります。

それを機能させる方法は?

回答

Mikelgo Dec 02 2020 at 16:47

スタックブリッツを用意しました。

私はあなたがしたのとほぼ同じことをしました。ただし、主な違い(そして、それが問題だと思いますが、なぜそれが機能しないのか)は、をどのように提供するかですplatform

NativeDateAdapter2番目の引数としてのニーズによって挿入できるプラットフォームID@Inject(PLATFORM_ID)これにより、正しいプラットフォームIDがAngularのDIによって提供されるようになります。

export class CustomDateAdapter extends NativeDateAdapter {
  constructor(
    @Inject(LOCALE_ID) public locale,
    @Inject(PLATFORM_ID) platformId
  ) {
    super(locale, platformId);
  }

の実装はgetFirstDayOfWeekあなたがしたように問題ありません。

注:私の例でAppModuleLOCALE_ID、ドイツの値として使用することを強制しているので、de。たとえば、でオーバーライドすることもできますen-US。また、コメントアウトするregisterLocaleDataか、プロバイダー全体を削除する必要があります。次に、日曜日の週の最初の日として表示されます。

コンストラクターが実行されない理由は少し疑わしいです。ここでの私の推測は、これはモジュール構造と関係があると思います。