angular - 如何添加服务提供商
问题描述
对于一个组件(@Component),我可以使用“providers: []”来添加注入令牌:
export const WINDOW_TOKEN = new InjectionToken<Window>('Window object');
@Component({
providers: [
{ provide: WINDOW_TOKEN, useValue: window }
]
})
export class ExampleClass {
constructor(@Inject(WINDOW_TOKEN) private windowObj: Window) {}
}
在这种情况下,我不必为这个简单的注入创建另一个服务。此外,这WINDOW_TOKEN
将仅在ExampleClass
. 更重要的是,我的测试用例可以window.open()
通过为windowObj
但是,我怎样才能为服务(@Injectable)做类似的事情?
@Injectable({
provideIn: 'root'
})
export class ExampleService {
constructor() {}
}
所以,对于这段代码,我如何创建一个@Inject
并且只在 this 中提供ExampleService
,而不是创建另一个@Injectable
并在根或模块中提供。
解决方案
您只能在模块级或组件级注册服务。
您必须为您将要使用的任何服务注册至少一个提供商。提供者可以是服务自身元数据的一部分,使该服务随处可用,或者您可以使用特定模块或组件注册提供者。您在服务的元数据中(在 @Injectable() 装饰器中)或在 @NgModule() 或 @Component() 元数据中注册提供程序
当您向特定的 NgModule 注册提供程序时,该 NgModule 中的所有组件都可以使用同一个服务实例。要在此级别注册,请使用 @NgModule() 装饰器的 providers 属性。
当您在组件级别注册提供程序时,您将获得一个新的服务实例以及该组件的每个新实例。在组件级别,在 @Component() 元数据的 providers 属性中注册一个服务提供者。
如果要注入另一个服务范围内的服务,则应将这两个服务封装在同一个模块中。
例如
@NgModule({
declarations: [],
imports: [],
providers: [ServiceA, ServiceB]
})
export class MyModule{}
然后,在您的服务中,您可以注入仅在同一服务范围内可用的服务。
@Injectable({})
export class ServiceA{
constructor(private sb: ServiceB) {}
//Service methods
}
推荐阅读
- tags - Sublime - 是否有在标签之间插入内容的快捷方式?
- r - 过滤字符串匹配 (str_detect),除了 R 中的特定相似值?
- r - R中的快速排序算法
- java - ObjectOutputStream/ObjectInputStream 的文件操作问题
- javascript - 我的显示/隐藏发生在所有循环结果上,而不是一键式
- ms-access - 在原始输入后自动将数据输入修剪到 Access 中的文本框中
- javascript - React Material UI 中的网格布局问题
- python - 从 selenium web 对象中获取文本并将其逐行附加到列表中
- requirejs - 防止 RequireJS 干扰遗留代码的建议
- python - Tkinter 异步鼠标和键盘输入