我有两个服务和一个组件。
服务A:
@Injectable({
providedIn: 'root'
})
export class AService {
public propertyA = 'propertyA initial state';
constructor(){}
}
服务B:
@Injectable({
providedIn: 'root'
})
export class BService{
constructor(public _servciceA: ServiceA){}
}
组件A
export class AComponent implements OnInit {
constructor(public _servciceA: ServiceA, public _serviceB: ServiceB){}
ngOnInit() {
this._serviceB._servciceA.propertyA = 'propertyA of serviceA changed by serviceB';
console.log(this._servciceA.propertyA) // prints 'propertyA initial state'
}
}
这两个服务都在app.module provider部分中声明,因此我期望AComponent和BService都具有相同的AService实例,而propertyA的更改将在另一个中反映出来。 这是预期的行为还是我错过了一些东西? 谢谢
编辑: 正如@benshabatnoan所说,ComponentA在库类型项目的模块中。抱歉,在给定的示例中没有告诉您。
我希望注入AComponent的AService与注入BService的实例相同。我该如何完成呢?
感谢您的困惑
答案 0 :(得分:1)
由于只有一个实例,因此可以共享。请检查此demo。
我所做的唯一区别是使用
在providers
中显式声明了app.module.ts
providers: [A, B],
由于OP不了解逻辑,因此我将进一步详细说明。
updateA(newVal: string) { // this method to update the value within service A
this.a.setVal(newVal);
}
getAVal() { // get the latest value within service A
return this.a.getVal();
}
getAValFromB() { // get the latest value within service A
// via service B, which holds a reference to service A instance via injector
return this.b.getValA();
}
如果您更新了值,但两个getter
中的值都发生了变化,那么演示将结束->它们共享同一个实例,当然您可以实现您的期望。
AComponent和BService都具有相同的AService实例,并且其中一个属性propertyA的更改将反映在另一个中。
有关更多详细信息,请参阅providers。
还有Injector hierarchy and service instances,它明确指出了规则:
一个应用只有个根注入器。在根或AppModule级别提供UserService意味着它已在根注入器中注册。整个应用程序中只有一个UserService实例,并且注入UserService的每个类均会获得此服务实例,除非您为其他提供者配置了子注入器。
答案 1 :(得分:0)
我已经退出
{
providedIn: 'root'
}
从所有服务中放到主模块的providers部分中,它可以按预期工作。 感谢您为我指出正确的方向。