在 angular2 中注入单例服务
Injecting a singleton service in angular2
我有一个在组件和其他服务之间共享数据的服务。我正在使用 angular 的 DI 将其注入组件和服务。该服务在其属性中存储一些数据(非静态)。我还使用 ComponentResolver 来动态创建和加载组件,然后销毁它们。问题是......如果我简单地在组件中注入这样的服务:
constructor(private myService: MyDataService) { ... }
每次注入此服务器的新实例,数据丢失。我可以静态存储数据,但随后会有观察者订阅该数据。长话短说 - 太多东西无法重构为静态变量。有什么方法可以告诉 angular 的 DI 只创建该服务的一个实例并在每次注入时共享它吗?
这是因为 Angulars DI 为每个提供者维护一个实例
如果您只提供一次服务(根组件或bootstrap()
),那么将只有一个实例,注入它的每个服务或组件都将获得相同的实例。
更新
是的,你必须使用
@NgModule({
providers: [MyService],
...,
})
export class AppModule {}
或
@Component({
selector: 'my-app',
providers: [MyService],
...
})
export class AppComponent {}
(或者 viewProviders
)
提供注射剂,但如果您想要单身人士,请确保只提供一次注射剂。
如果您多次提供相同的可注入组件,那么您提供它的组件及其所有后代都会从这个提供者那里获得实例,而不是从可能也提供它的祖先那里获得实例。
DI 是分层的,从当前组件向根组件查找,AppModule
向提供者查找。它从以这种方式找到的第一个提供者注入实例。
我有一个在组件和其他服务之间共享数据的服务。我正在使用 angular 的 DI 将其注入组件和服务。该服务在其属性中存储一些数据(非静态)。我还使用 ComponentResolver 来动态创建和加载组件,然后销毁它们。问题是......如果我简单地在组件中注入这样的服务:
constructor(private myService: MyDataService) { ... }
每次注入此服务器的新实例,数据丢失。我可以静态存储数据,但随后会有观察者订阅该数据。长话短说 - 太多东西无法重构为静态变量。有什么方法可以告诉 angular 的 DI 只创建该服务的一个实例并在每次注入时共享它吗?
这是因为 Angulars DI 为每个提供者维护一个实例
如果您只提供一次服务(根组件或bootstrap()
),那么将只有一个实例,注入它的每个服务或组件都将获得相同的实例。
更新
是的,你必须使用
@NgModule({
providers: [MyService],
...,
})
export class AppModule {}
或
@Component({
selector: 'my-app',
providers: [MyService],
...
})
export class AppComponent {}
(或者 viewProviders
)
提供注射剂,但如果您想要单身人士,请确保只提供一次注射剂。
如果您多次提供相同的可注入组件,那么您提供它的组件及其所有后代都会从这个提供者那里获得实例,而不是从可能也提供它的祖先那里获得实例。
DI 是分层的,从当前组件向根组件查找,AppModule
向提供者查找。它从以这种方式找到的第一个提供者注入实例。