Изменения в свойстве сервиса Angular не отражаются - PullRequest
0 голосов
/ 17 января 2019

У меня есть две службы и компонент.

Сервис 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, поэтому я ожидал, что и AComponent, и BService имели один и тот же экземпляр AService, и изменения свойства propertyA в одном будут отражены в другом. Это ожидаемое поведение или я что-то упустил? Спасибо

EDIT: Как сказал @benshabatnoan, ComponentA находится в модуле проекта библиотечного типа. Извините, что не сказал этого в данном примере.

  • Две услуги находятся в основном проекте.
  • AService внедряется в BService.
  • AComponent находится в другом модуле в проекте типа библиотеки
  • Обе услуги внедряются в компонент AC

Я хочу, чтобы AService, внедренный в AComponent, был таким же экземпляром, как внедренный в BService. Как мне это сделать?

Спасибо и извините за сумбур

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Я ушел

{
    providedIn: 'root'
}

из всех сервисов и поместите их в раздел провайдеров основного модуля, и все заработало как положено. Спасибо, что указал мне правильное направление.

0 голосов
/ 17 января 2019

Может использоваться совместно, поскольку существует только один экземпляр. Пожалуйста, проверьте это демо .

Единственное отличие, которое я сделал, - это явное объявление providers в app.module.ts с

providers: [A, B],

Подробнее об основных логиках

Поскольку ОП не понимает логику, я остановлюсь подробнее.

  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, и изменения свойства A в одном будут отражены в другом.

Для получения более подробной информации, пожалуйста, обратитесь к провайдерам .

И Инжекторная иерархия и экземпляры службы , в которых четко указано правило:

Для приложения есть только один корневой инжектор . Предоставление UserService на уровне root или AppModule означает, что он зарегистрирован в корневом инжекторе. Существует всего один экземпляр UserService во всем приложении, и каждый класс, который внедряет UserService, получает этот экземпляр службы , если вы не настроите другого поставщика с дочерним инжектором .

...