Angular 9-拡張する方法(ロケール対応の週の始まり)NativeDateAdapterは機能しますか?
ロケールを認識させるために(週の始まりに関して)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がインスタンス化されておらず(ブレークポイントがヒットしていない)、週の始まりが変更されていないことです。月曜日に変更する必要があります。
それを機能させる方法は?
回答
スタックブリッツを用意しました。
私はあなたがしたのとほぼ同じことをしました。ただし、主な違い(そして、それが問題だと思いますが、なぜそれが機能しないのか)は、をどのように提供するかですplatform
。
NativeDateAdapter
2番目の引数としてのニーズによって挿入できるプラットフォーム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
あなたがしたように問題ありません。
注:私の例でAppModule
はLOCALE_ID
、ドイツの値として使用することを強制しているので、de
。たとえば、でオーバーライドすることもできますen-US
。また、コメントアウトするregisterLocaleData
か、プロバイダー全体を削除する必要があります。次に、日曜日の週の最初の日として表示されます。
コンストラクターが実行されない理由は少し疑わしいです。ここでの私の推測は、これはモジュール構造と関係があると思います。