Angular 未反映角度服务属性的更改

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

我有两个服务和一个组件

服务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 providers部分声明的,所以我希望AComponent和BService都具有相同的AService实例,其中一个中的propertyA的更改将反映在另一个中。 这是预期的行为还是我遗漏了什么? 谢谢

编辑: 正如@benshabatnoan所说,ComponentA位于库类型项目的模块中。很抱歉,在给定的示例中没有说明这一点

  • 这两项服务是主要项目
  • 服务被注入到BService中
  • 组件位于库类型项目的另一个模块中
  • 这两个服务都被注入到组件中
我希望在组件中注入的AService与在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。
我所做的唯一区别
我会说您的代码完全不同