我知道如何为我的整个程序创建单例服务(通过在app.module中声明)。但是我想创建一个服务,该服务仅是其下所有组件的单例。例如:
在这个层次结构中,我希望Service
是一个只能由子代1.x使用的单例,而不能由Main2或Child2使用。这是我的服务:
import { Injectable } from '@angular/core';
@Injectable()
export class SharedService {
...
}
但是我必须在app.module
中导入此服务吗?如果我将其导入app.module
,则它是全局的,我不希望它是全局的。
答案 0 :(得分:2)
这就是Angular的层级依赖性的全部内容。
一个组件也有一个providers
数组。您可以将服务添加到该阵列。然后,此组件及其任何子组件将共享同一单例。
因此您的Main1中将有一个RootComponent
。在它的@Component
元数据中,只需添加一个providers
数组并在那里为您的服务指定令牌。
这就是代码中的样子:
@Component({
...,
providers: [ SharedService ]
})
export class Main1Component { ... }
现在,您已经完成了此操作,SharedService
将只能由Main1,Child1.1,Child1.1.1和Child1.2访问。
考虑一下我在此Working Sample StackBlitz中拥有的示例。
在这里,我们有两个组件层次结构(Main 1和Main 2)。 Main1和Main2都已将SharedService
添加到其providers
装饰器元数据的@Component
数组中。
由于这个原因,Main 1及其子项将拥有SharedService
的自己的实例。 Main 2及其子级将拥有自己的SharedService
实例。这两个实例不完全相同。
这就是为什么当我单击第一个按钮时,只有Main1及其子级消息发生更改的原因:更改SharedData-这只会更改Main 1及其子级的SharedData
与Button 2一样,因为它只会更新Main 2及其子项的内容。
希望这种解释有所帮助。看看样本StackBlitz,它将更加清晰。