我需要使用一个服务的多个实例。
通常当我在组件中使用此服务的一个实例时,我这样写:
@Component({
selector: 'one-component',
providers: [provide("token1", {useClass: Service})],
template: `
<h1>App</h1>
`
})
export class OneComponent {
constructor(@Inject('token1') service:Service) {}
}
但是现在我需要在Service2中使用这个服务,我这样写:
export class Service2 {
constructor(@Inject('token1') service:Service) {}
}
如您所知,它显示:
没有提供者
因为Service2
没有providers: [provide("token1", {useClass: Service})]
。但是我可以在哪里添加它,因为它没有@Component
?
由于
答案 0 :(得分:3)
目前不支持以这种方式配置服务,目前还没有计划添加支持https://github.com/angular/angular/issues/5622
答案 1 :(得分:0)
我认为Gunter的答案在这里并不完全正确。
如果我正确理解了洪波苗的问题,这可以“轻松”实现。
如果您想在每次注入时获得服务的新实例,则必须使用useFactory
而不是useClass
提供程序配置。
然后,如果"token1"
Service2
中的OneComponent
没有提供商错误,那是因为它没有配置在Service2
的正确注入器,同级或父级...其中{{1}注入。
修改强>
要使其工作,您必须在根组件(例如)中定义Service
和Service2
提供程序。在这种情况下,所有人都将共享相同的服务实例。
如果要在每个组件中包含不同的实例,请在组件级别定义提供程序,这些提供程序正在使用服务。
@Component({
providers: [Service, Service2],
// Other config props
})
export class RootComponent {
}
@Component({
// Config props
})
export class OneComponent {
constructor(public service: Service) {}
methodx() {
this.service...
}
}
@Component({
// Config props
})
export class TwoComponent {
constructor(public service: Service2) {}
methodx() {
this.service...
}
}
@Injectable()
export class Service2 {
constructor(public service: Service) {
}
}
使用@Inject('StringToken')
不是你做的最好的事情,也不是推荐的方法。请改用类型标记(如上面的代码所示)。
资源:
答案 2 :(得分:0)
我已通过声明app.module.ts
的提供商数组中的两项服务来纠正此错误(将服务B用于服务A)。
@NgModule({
declarations: [...],
imports: [...],
providers: [
ServiceA,
ServiceB,
],
bootstrap: [...],
})