Angular 2 Value Providers - 在初始化时从API调用设置的值

时间:2016-06-25 22:03:21

标签: dependency-injection angular angular2-services

我需要为我们的应用程序提供日期格式。我们使用它来设置所有显示和输入日期的格式。

我需要在应用程序的许多地方提供这个。但是,日期因客户而异。我们有一个API调用,它提供了各种设置(其中一个是日期配置)作为JSON对象。

我希望能够通过DI提供一个表示配置选项的对象作为值。有许多提供值的例子,但它们都是静态的而不是动态的。

我想在我的DI组合根

中做这样的事情
provide('DateFormat', {
  useValue: 'dd/MM/yyyy'  
})

但是,我希望'dd / MM / yyyy'来自启动时的设置。

我曾尝试通过服务提供它,但它导致一些地方的竞争条件问题(当一个服务运行时值不可用)。其中一些可以通过使用更多的observable重写它来解决,但它只会使代码更复杂。所以我想通过DI提供一些方法,并在做其他任何事情之前设置值。

任何想法如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

如果您在引导程序中提供服务,或者在应用程序的根组件中的提供程序:[]中提供服务,它将实例化该服务。在服务构造函数中,您可以通过api获取数据。

如果您需要等到第一页显示之前加载,您可以有一个observable指示数据是否已加载。使用该observable通过订阅observable来路由到新组件。或者,根据应用程序的结构,在服务设置的布尔值observable上使用* ngIf来显示初始化屏幕,直到api调用返回并初始化数据。

需要该配置的任何其他组件都可以通过构造函数args注入该服务实例。

import {ConfigurationService} from 'path/to/configuration-service';

@Component({
    selector : '',
    providers: [ConfigurationService] <<-- This instantiates a new
    uninitialized service. Do this only in the root component.


})

export ComponentNeedingDateFormat() {
    constructor(private configurationService: ConfigurationService) { }
}

如果将其包含在组件提供程序中:[]它将实例化一个新服务。您只想在根组件中注入它。

https://angular.io/docs/ts/latest/guide/dependency-injection.html