11

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);
      });
    });
  });
}

根据Angular 的源代码,在我的情况下,浏览器(平台)准备就绪(DOM、位置和历史准备就绪,我猜)。

不幸的是,它并没有真正记录在任何地方。

我没有使用上面的示例LOCATION_INITIALIZED,它按预期工作。

那么我为什么要关心LOCATION_INITIALIZED它以及何时应该使用它呢?

4

1 回答 1

1

我使用相同的代码安全地初始化ngx-translate翻译,以便使用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);
        });
});

}

于 2020-05-14T23:39:20.487 回答