在angular2中注入单件服务

时间:2016-05-31 12:47:43

标签: dependency-injection angular angular2-di

我有一项服务,用于在组件和其他服务之间共享数据。我用角度DI将其注入组件和服务中。该服务将一些数据存储在其属性中(非静态)。我还使用ComponentResolver动态创建和加载组件,然后销毁它们。问题是......如果我使用简单的方法在组件中注入这样的服务:

constructor(private myService: MyDataService) { ... }

每次注入此服务器的新实例,数据都会丢失。我可以静态存储数据,但是有观察员订阅这些数据。长话短说 - 太多的事情要重构为静态变量。是否有某种方法可以告诉角度的DI只创建一个此服务的实例并在每次注入时共享它?

1 个答案:

答案 0 :(得分:1)

这是因为Angulars DI维护单个实例每个提供商

如果您只提供一次服务(根组件或bootstrap()),则只有一个实例,并且注入它的每个服务或组件将获得相同的实例。

<强>更新

是的,您必须使用

@NgModule({
  providers: [MyService],
  ...,
})
export class AppModule {}

@Component({ 
  selector: 'my-app', 
  providers: [MyService], 
  ...
})
export class AppComponent {}

(或viewProviders

提供注射剂,但如果您想要单身,请确保您只提供一次注射

如果您提供的注射表不止一次,那么您提供它的组件及其所有后代都会从此提供程序获取实例,而不是从也可能提供它的祖先获取实例。

DI是分层的,从当前组件向根组件查找,并为提供者查看AppModule。它从这样找到的第一个提供者注入实例。