Angular 9 MatDatePicker + Интернационализация Превышен максимальный размер стека вызовов - PullRequest
0 голосов
/ 30 апреля 2020

Я пытаюсь использовать интернационализацию в своем приложении angular 9, когда я открываю поле datepicker, в консоли отображается следующая ошибка:

Снимок экрана ошибки консоли

Это мой код адаптера DatePicker

import { Injectable } from '@angular/core';
import { NativeDateAdapter } from '@angular/material';
import { BehaviorSubject } from 'rxjs';


export const CUSTOM_DATE_FORMAT = {
    parse: {
        dateInput: null
    },
    display: {
        dateInput: 'CustomFormat',
        monthYearLabel: { year: 'numeric', month: 'short' },
        dateA11yLabel: { year: 'numeric', month: 'long', day: 'numeric' },
        monthYearA11yLabel: { year: 'numeric', month: 'long' },
    }
};

export const datepicker: BehaviorSubject<string> = new BehaviorSubject('');

@Injectable()
export class Datepicker extends NativeDateAdapter {


    private subscription: any;

    format(date: Date, displayFormat?: string | object): string {
        if (!this.subscription) {
            this.subscription = datepicker.subscribe(v => {
                this.setLocale(v);
            });
        }

        if (this.locale === 'CustomFormat') {
            const day = date.getUTCDate();
            const month = date.getUTCMonth() + 1;
            const year = date.getFullYear();

            // Return the format as per your requirement
            return `${day}.${month}.${year}`;
        } else {
            // Refer to the standard formatting of the NativeDateAdapter.
            return super.format(date, displayFormat);
        }
    }

}

1 Ответ

0 голосов
/ 30 апреля 2020

При вызове формата setLocale fun c вызывается снова из-за триггера изменения внутри, так что вы никогда не выйдете из этого, что приведет к превышению размера стека вызовов.

Изменить функцию форматирования на:

format(date: Date, displayFormat?: string | Object): string {
    let loc = appLocale.getValue();
    if (this.locale !== loc)
        this.setLocale(loc);
    return super.format(date, displayFormat);
}

Если вы подпишетесь на BehaviorSubject, вы получите много вызовов на изменение, даже если это одно и то же значение.

Вы можете отметьте этот

...