结构问题
我不太确定是否找到了这两行代码的正确位置:
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 的话,它就无法工作,因为内部的更改触发器,格式函数会再次被调用 - 所以你永远不会摆脱这个..