Angular 未反映角度服务属性的更改
我有两个服务和一个组件 服务A:Angular 未反映角度服务属性的更改,angular,dependency-injection,Angular,Dependency Injection,我有两个服务和一个组件 服务A: @Injectable({ providedIn: 'root' }) export class AService { public propertyA = 'propertyA initial state'; constructor(){} } 服务B: @Injectable({ providedIn: 'root' }) export cl
@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 providers部分声明的,所以我希望AComponent和BService都具有相同的AService实例,其中一个中的propertyA的更改将反映在另一个中。
这是预期的行为还是我遗漏了什么?
谢谢
编辑:
正如@benshabatnoan所说,ComponentA位于库类型项目的模块中。很抱歉,在给定的示例中没有说明这一点
- 这两项服务是主要项目李>
- 服务被注入到BService中李>
- 组件位于库类型项目的另一个模块中
- 这两个服务都被注入到组件中
感谢并抱歉造成混淆因为只有一个实例,所以可以共享。请检查这个 我所做的唯一区别是在
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
中的值都发生了更改,那么演示结束->它们共享同一个实例,当然您可以实现您的期望
组件和BService都有相同的AService实例,其中一个实例的属性a的变化将反映在另一个实例中
有关更多详细信息,请参阅
而且,这清楚地指出了规则:
一个应用程序只有一个根注入器。在根或AppModule级别提供UserService意味着它已在根注入器中注册。整个应用程序中只有一个UserService实例,注入UserService的每个类都会获得此服务实例,除非您使用子注入器配置另一个提供程序
我已经辞职了
{
providedIn: 'root'
}
并将它们放在主模块的providers部分,它就如预期的那样工作了。
感谢您为我指明了正确的方向。您能尝试从模块提供程序中删除它们吗?在服务的“根”中声明
providedIn时,您不应该也在模块提供程序中声明它。这是此服务的重复注册。您可以复制吗?我创建了一个小示例,它可以按预期工作:我设法重现此问题的唯一方法是当组件的提供者列表中提供了serviceA时。根据您的问题描述,不清楚您是如何获得serviceA
类的两个实例的。您的a组件可能在另一个模块中?还有一件事,也许你在另外一个地方提供服务a
?您可以在ServiceA
构造函数中添加一个断点,并查看为什么它要初始化两次……在您的演示中,a不是一个服务,即它没有@Injectable()decorator。请检查。@Injector()
用于此服务需要其他服务时。如果你愿意,你可以添加它,但它不会改变任何东西,只会增加额外的冗余。也许你可以阅读这篇文章来澄清这个概念:@Gourishankar@Injectable()
只有在你的服务中注入另一个服务时才是必需的。用@Injectable
装饰每个服务是一个很好的做法。无论如何,如果您使用providedIn
声明您的服务,您将被迫使用decorator。我所做的唯一区别
我会说您的代码完全不同