3

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

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

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

4

1 回答 1

1

这是因为 Angulars DI 为每个提供者维护一个实例

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

更新

是的,你必须使用

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

或者

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

(或替代viewProviders

提供注射剂,但如果你想拥有单例,请确保只提供一次注射剂

如果您多次提供相同的可注入对象,那么您提供它的组件及其所有后代都会从该提供者那里获取实例,而不是从可能也提供它的祖先那里获取实例。

DI 是分层的,从当前组件向根组件和AppModule提供者查找。它从它以这种方式找到的第一个提供者注入实例。

于 2016-05-31T12:49:06.477 回答