Angular Material 日期选择器 |延迟加载 + CustomDateAdapter + 国际化 - RangeError:超出最大调用堆栈大小

2024-01-09

结构问题

我不太确定是否找到了这两行代码的正确位置:

providers: [
    { provide: MAT_DATE_LOCALE, useValue: 'de-DE' },
    { provide: DateAdapter, useClass: CustomDateAdapter, deps: [MAT_DATE_LOCALE, Platform] }
  ]

目前它们位于我的material.module =>中,它是在shared.module中导入的 => 在 app.module 和每个延迟加载的模块中导入。

自定义日期适配器:

@Injectable()
export class CustomDateAdapter extends NativeDateAdapter {
    subscription: any;

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

appLocal 在我的翻译服务中:

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

(我发现这段代码在这里工作:Blitz https://angular-6vupnn.stackblitz.io)

我的情况是 - 我有一个日期选择器,我可以在三种语言之间切换语言,而无需重新加载网站。

我的问题 - 我有一个全球翻译服务 - 所以它不像上面的 stackblitz 那样我正在更改组件中的语言,因为这是 app.component 中的下拉菜单。当我在 app.module 和延迟加载模块(日期选择器所在的位置)中导入材料时,这无法工作,因为我有两个 CustomDateAdapter 实例,并且只更改了 app.component 一个。 (我希望我正确理解了导入/导出/提供者的内容..)

我想我用BehaviourSubject 和订阅修复了这个问题..但是这是正确的方法吗?我只想在全球范围内注册这两个提供商一次。

错误问题

很抱歉这个长结构问题,因为它实际上正在起作用。不幸的是我收到了这个错误。

osp-error-handler.ts:12 RangeError: Maximum call stack size exceeded
    at BehaviorSubject.push../node_modules/rxjs/internal/Observable.js.Observable._trySubscribe (Observable.js:51)
    at BehaviorSubject.push../node_modules/rxjs/internal/Subject.js.Subject._trySubscribe (Subject.js:102)
    at BehaviorSubject.push../node_modules/rxjs/internal/Observable.js.Observable.subscribe (Observable.js:30)
    at CustomDateAdapter.push../src/app/shared/plugins/material/mat-datepicker.ts.CustomDateAdapter.format (mat-datepicker.ts:40)
    at MatDatepickerInput.push../node_modules/@angular/material/esm5/datepicker.es5.js.MatDatepickerInput._formatValue (datepicker.es5.js:3259)
    at MatDatepickerInput.set [as value] (datepicker.es5.js:2961)
    at SafeSubscriber._next (datepicker.es5.js:2900)
    at SafeSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.SafeSubscriber.__tryOrUnsub (Subscriber.js:196)
    at SafeSubscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.SafeSubscriber.next (Subscriber.js:134)
    at Subscriber.push../node_modules/rxjs/_esm5/internal/Subscriber.js.Subscriber._next (Subscriber.js:77)

当我第一次使用日期选择器打开页面时,就会发生该错误。当我更改日期或切换路线时,这种情况不会再次发生。我认为有一些问题:

 return super.format(date, displayFormat);

我希望有人能帮帮忙 :)

编辑 1 - 错误已修复:

将格式函数更改为:

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

感谢谢尔盖带领我走向正确的方向。如果您订阅了BehaviorSubject,您将收到很多更改调用(即使它是相同的值 - 不完全知道为什么)。因为如果没有 if 我认为如果你调用 setLocale 的话,它就无法工作,因为内部的更改触发器,格式函数会再次被调用 - 所以你永远不会摆脱这个..


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular Material 日期选择器 |延迟加载 + CustomDateAdapter + 国际化 - RangeError:超出最大调用堆栈大小 的相关文章

随机推荐