服务B保存对服务A的引用 - 如果我通过Angular2 bootstrap()方法实例化服务A,我需要做的就是在服务B中添加对服务A的引用构造函数和Angular愉快地将服务A注入服务B ...但是如果组件1需要它自己的服务B实例,组件2需要它自己的服务B实例...服务B怎么样?提供其依赖服务A的唯一实例(例如,组件1和服务A的状态不应受组件2的服务A状态的影响)? ---这意味着服务B需要能够实例化独立服务A实例......我想我可以在服务A中new
服务B(但这不是依赖注入)......对于注入服务的服务,我基本上需要providers: []
元数据......
或(更简单地说)
有人可以共享从bootstrap()方法或组件以外的某个地方提供的服务的代码示例吗?
答案 0 :(得分:2)
不幸的是,服务无法提供依赖关系。
您可以做的最好的事情是导出提供者数组并在所需的组件中提供它。
Export class ServiceB {
constructor(serviceA: ServiceA) {}
...
}
Export const SERVICEB_PROVIDERS = [ ServiceB, ServiceA ];
然后在组件中:
@Component {
...
providers: [SERVICEB_PROVIDERS]
...
}
有关详细信息,请参阅角度回购中的github issue。
答案 1 :(得分:1)
在@Component中指定提供程序属性时,您告诉依赖项注入为此特定组件提供新实例。
如果您未在提供程序中指定服务,则依赖关系请求会冒泡下一个父组件,并将继续在每个父组件中查找提供程序,直到找到提供程序或获取引导程序函数。
这将为Component1提供它自己的ServiceB。它不会引用您在引导程序中提供的那个:
@Component({
selector: "Component1",
templateUrl: "./blah/component1.component.html",
providers: [ServiceB]
})
export class Component1{
...
如果在父组件中找不到另一个提供者属性,那么这个将从您的引导函数中获取ServiceB。
@Component({
selector: "Component2",
templateUrl: "./blah/component2.component.html"
})
export class Component2{
...
答案 2 :(得分:0)
我偶然发现了Victor Savkin's blog post about Angular Dependency Injection
的摘录// Angular 2: Configuring LoginService
@Injectable() class LoginService {
constructor(@Inject("LoginServiceConfig") public config: {url: string}) {}
//...
}
@Component({
selector: 'app',
template: `<login></login>`,
directives: [Login],
providers: [
LoginService,
provide("LoginServiceConfig", {useValue: {url: 'myurl'})
]
})
class App {}
它说明了如何将(子)服务注入到(父)服务中,其中注入(父)服务的(子)服务(必须是?)由组件使用其中的父组件提供(其中) parent)服务提供给组件......