如何在服务中使用提供者?
我需要使用一个服务的多个实例。
通常,当我在组件中使用此服务的一个实例时,我会这样写:
@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
?
谢谢
目前不支持以这种方式配置服务,目前还没有计划添加支持https://github.com/angular/angular/issues/5622
我不认为甘特的答案在这里完全正确。 如果我正确理解了洪波苗的问题,这可以“轻松”实现。 如果您想在每次注入时获得服务的新实例,则必须使用useFactory
而不是useClass
提供程序配置。
然后,如果你得到一个没有提供错误"token1"
在Service2
,那是因为它没有在右侧注射器,兄弟姐妹或父母配置OneComponent
,其中... Service2
注入。
编辑:
为此,您必须在根组件(例如)中定义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')
不是你所做的最好的事情,也不是推荐的方法。 改为使用Type标记(如上面的代码中所做的那样)。
资源:
我已经通过在app.module.ts
的提供程序数组中声明这两个服务来纠正此错误(将服务B用于服务A)。
@NgModule({
declarations: [...],
imports: [...],
providers: [
ServiceA,
ServiceB,
],
bootstrap: [...],
})
链接地址: http://www.djcxy.com/p/32509.html