Angular-从根模块中的服务访问值

时间:2018-06-20 01:03:01

标签: javascript angular typescript dependency-injection angular-services

我正在致力于Angular应用程序的国际化,需要动态检测用户为应用程序主动 选择的语言环境(用户必须主动切换语言环境才能显示该网站)以其首选语言)。

在我的根模块中,我为TRANSLATIONS指定了以下提供程序,其中所需的xlf文件(翻译文件)是使用取决于我的LOCALE_ID值的工厂动态确定的:

app.module.ts

... imports go here

export function selectedLocaleFactory(): string {
  return LocaleService.getCurrentLanguage();
}

providers:
[
  LocaleService,
  {
    provide: TRANSLATIONS,
    useFactory: (locale) => {
      locale = locale || 'en'; // default to english if no locale provided
      return require(`raw-loader!../locale/messages.${locale}.xlf`);
    },
    deps: [LOCALE_ID]
  },
  {
    provide: LOCALE_ID,
    useFactory: selectedLocaleFactory
  }
]

如您所见,在TRANSLATIONS提供程序中,我正在根据LOCALE_ID的值确定要使用的翻译文件。

LOCALE_ID是通过使用另一个工厂(selectedLocaleFactory)确定的,该工厂仅尝试使用getCurrentLanguage中的方法LocalService返回LOCALE_ID值。我不确定这是否是从我的服务中获取价值的正确/最佳方法-我的意思是selectedLocaleFactory并不是真正的“工厂”,并且服务旨在注入。

无论如何,我在app.module.ts中遇到此编译错误:

Property 'getCurrentLanguage' does not exist on type 'typeof LocaleService'.

以下是我的LocalService的摘录:

@Injectable()
export class LocaleService {

  private currLanguage: string;

  constructor( private router: Router ) {
         // this.currLanguage is set here - based on the URL being accessed by the user
  }

  getCurrentLanguage() { 
    return this.currLanguage;
  }

如果我将LocaleService内的getCurrentLanguage设为静态方法,则仍然无法访问:

  static getCurrentLanguage() { 
    return this.currLanguage;
  }

更新:

我意识到我需要实例化服务以访问适当的方法:

export function selectedLocaleFactory(): string {
  var localeService = new LocaleService(null);
  return localeService.getCurrentLanguage();
}

我的LocaleService具有Router依赖性,因此我将其设置为null。仍然感觉像我在尝试以错误的方式执行此操作。我的LocaleService实际上应该是单身人士,我担心使用当前方法可能会遇到问题(例如,阴影问题)。我可以从根模块内的服务访问属性吗?

@Thierry Templier在这里的回答-What is the best way to declare a global variable in Angular 2 / Typescript建议引导服务以访问其变量之一,但是这种方法给我一个错误,说我不能将服务用作入口点。 / p>

0 个答案:

没有答案