我尝试将LOCALE_ID注入我的自定义组件,并在每个ngOnChanges事件中跟踪它,以防它被更改(用其他语言重新启动组件)。
在AppModule中,我有LOCALE_ID提供程序,它返回当前语言代码(' en'' fr'等等):
{
provide: LOCALE_ID,
deps: [I18NextService],
useFactory: (i18next: I18NextService) => {
return i18next.language; //string: 'en', 'ru'...
}
}
默认情况下,OpaqueToken LOCALE_ID注册为值" en-US"。
{
provide: LOCALE_ID,
useValue: 'en-US'
}
然后我使用构造函数注入器实现我的组件
constructor(private injector: Injector) {
}
然后我解决了LOCALE_ID依赖关系以获取当前的语言环境。
ngOnChanges(changes: SimpleChanges) {
let localeId = this.injector.get(LOCALE_ID);
...
}
问题是LOCALE_ID提供者注册为singleton,我总是得到第一个解析的值......
要求:
我不希望自定义组件知道我的I18NextService
我不想更改LOCALE_ID解决后返回的类型。这可能会破坏其他期望LOCALE_ID为字符串的libs \控件。这就是我无法将LOCALE_ID解析为工厂功能的原因。
如果我只能注册瞬态解析器就没有问题,但是角度2 DI似乎没有这个功能(Aurelia确实如此)
欢迎提出建议!