我想在 Angular2 中对单身人士服务有一些解释。 我在plnkr中做了一个简单的例子:http://plnkr.co/edit/09XVxN?p=preview
尝试通过单击两个按钮来更改显示的组件。您将在调试器控制台中看到ServiceA
构造函数console.log
消息。
为什么AService
在这种情况下不是单身人士?因为每次切换显示的组件时,它都会调用AService
构造函数...
先谢谢
答案 0 :(得分:1)
将服务添加到组件的providers:
列表时,每个组件都会获得一个新实例
仅将其添加到bootstrap(AppComponent, [AService])
,整个应用程序将获得相同的参考。
在Angulars DI中,每个提供的实例都是单例,但仅在创建实例的注入器范围内 Angulars DI是分层的。对于每个组件,创建子注入器。 DI从最近的注射器开始,以解决所需的类型。如果有提供者但还没有实例,则会创建一个。如果没有提供者DI迭代到父注射器,直到它找到一个或直到它到达根注射器。如果它到达根注入器并仍然没有找到它抛出的提供者。
添加到bootstrap()
的提供程序是根注入器的提供程序,因此适用于整个应用程序,而不是在层次结构的下层,另一个注入器具有注册的相同类型的提供程序。
答案 1 :(得分:1)
实际上,这取决于您放置相应提供商的位置:
如果你把它放在bootstrap级别,那么整个应用程序就会有一个实例
bootstrap(AppComponent, [ MyService ]);
如果将它放在组件级别,则每个组件实例都有一个实例。
@Component({
(...)
providers: [ MyService ]
})
export class MyComponent {
(...)
}
这是因为Angular2的分层注入器。你可以做得更精细,因为它也可以使用来自父组件的提供者......
这个答案可以为您提供更多详细信息: