我在LOCATION_INITIALIZED研究加载ngx-translate的翻译时偶然发现APP_INITIALIZER(请在此处输入链接描述
import { Injector, APP_INITIALIZER } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { LOCATION_INITIALIZED } from '@angular/common';
export function appInitializerFactory(translate: TranslateService, injector: Injector) {
return () => new Promise<any>((resolve: any) => {
const locationInitialized = injector.get(LOCATION_INITIALIZED, Promise.resolve(null));
locationInitialized.then(() => {
const langToSet = 'en-GB'
translate.setDefaultLang('en-US');
translate.use(langToSet).subscribe(() => {
console.info(`Successfully initialized '${langToSet}' language.'`);
}, err => {
console.error(`Problem with '${langToSet}' language initialization.'`);
}, () => {
resolve(null);
});
});
});
}
Run Code Online (Sandbox Code Playgroud)
根据angular的源代码,就我而言,浏览器(平台)已准备就绪(DOM,位置和历史记录已准备就绪,这是我的猜测)。
不幸的是,它并没有真正记录在任何地方。
我在没有示例的情况下使用了上面的示例LOCATION_INITIALIZED,它按预期工作。
那么,我为什么要关心LOCATION_INITIALIZED它?何时使用它?
小智 1
我使用相同的代码安全地初始化ngx-translate翻译,以便使用翻译服务的即时方法,我也有同样的疑问。
无论如何,在线搜索并根据 APP_INITIALIZER 的文档,我们只需要提供将在应用程序初始化期间执行的函数(使用 Promise 初始化在 Promise 解决之前不会完成)。
所以是的,您可以摆脱 LOCATION_INITIALIZED 并使用这个函数(我正在使用它并且它工作正常)。
export function appInitializerTranslationsFactory(translate: TranslateService) {
return () => new Promise<any>((resolve: any) => {
const langToSet = 'en';
translate.setDefaultLang('en');
translate.use(langToSet).subscribe(() => {}, err => {}, () => {
resolve(null);
});
});
Run Code Online (Sandbox Code Playgroud)
}
| 归档时间: |
|
| 查看次数: |
409 次 |
| 最近记录: |