Angular服务属性的更改未得到反映

时间:2019-01-17 08:55:46

标签: angular dependency-injection

我有两个服务和一个组件。

服务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在库类型项目的模块中。抱歉,在给定的示例中没有告诉您。

  • 这两个服务在主项目中。
  • AService已注入BService中。
  • AComponent在库类型项目的另一个模块中
  • 这两种服务都注入了AComponent

我希望注入AComponent的AService与注入BService的实例相同。我该如何完成呢?

感谢您的困惑

2 个答案:

答案 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部分中,它可以按预期工作。 感谢您为我指出正确的方向。