小编Ser*_*huk的帖子

Angular 2:动态获取 LOCALE_ID(根据请求解析)

我正在尝试将 LOCALE_ID 注入我的自定义组件并在每个 ngOnChanges 事件上跟踪它,以防它已更改(以使用其他语言重新初始化组件)。

在 AppModule 中,我有 LOCALE_ID 提供程序返回当前语言代码('en'、'fr' 等):

{
 provide: LOCALE_ID,
 deps: [I18NextService],
 useFactory: (i18next: I18NextService) => {
  return i18next.language; //string: 'en', 'ru'...
 }
}
Run Code Online (Sandbox Code Playgroud)

默认情况下 OpaqueToken LOCALE_ID 注册为值“en-US”。

{
  provide: LOCALE_ID,
  useValue: 'en-US'
}
Run Code Online (Sandbox Code Playgroud)

然后我用构造函数注入器实现我的组件

constructor(private injector: Injector) {
}
Run Code Online (Sandbox Code Playgroud)

然后我解析 LOCALE_ID 依赖项以获取当前语言环境。

ngOnChanges(changes: SimpleChanges) {
  let localeId = this.injector.get(LOCALE_ID);
   ...
}
Run Code Online (Sandbox Code Playgroud)

问题是 LOCALE_ID 提供程序注册为单例,我总是得到第一个解析值......

要求:

  1. 我不希望自定义组件了解我的 I18NextService

  2. 我不想更改 LOCALE_ID 解析后返回的类型。这可能会破坏其他希望 LOCALE_ID 为字符串的库\控件。这就是为什么我无法将 LOCALE_ID 解析为工厂函数的原因。

如果我可以只注册瞬态解析器就没有问题,但是 angular 2 DI 似乎没有这个功能(Aurelia 有)

欢迎提出建议!

singleton dependency-injection localization transient angular

5
推荐指数
0
解决办法
2773
查看次数