Понимание углового общего сервиса - PullRequest
0 голосов
/ 24 октября 2018

Я хочу, чтобы общий объем моего компонента обновлялся по мере его изменения, и мне интересно, верно ли это:

У меня есть shared.service.ts, который вводится в мой компонент, так что это выглядит так (мой общий сервис):

shared.service.ts

private sumEmit= new BehaviorSubject<number>(0);

public updateValues() {
this.sum= 0;
this.sum+= +(price*quant).toFixed(2);
this.sumEmit.next(this.sum);
}

Метод получения общей суммы также в сервисе:

 getTotal(): BehaviorSubject<number> {
    return this.sumEmit;
  }

Итак, каждый раз, когда вызывается метод updateValues(), он будет выдавать значение суммы,это верно?

И в моем компоненте, который должен извлекать значение каждый раз, когда значение изменяется, я сделал это:

mycomponent.component.ts

Сначала я ввел общий сервис, после этого в ngOnInit жизньцикл hool я написал:

// simple variable to hold value from service

total : number;


ngOnInit() 
{
    this.total = this.SharedService.getTotal();
}

Означает ли это, что мое значение будет обновляться при каждом изменении общей суммы?

Самым запутанным для меня является то, что я вызывал этот метод только один раз в ngOnInit, который отображается при открытии компонента, но значение постоянно обновляется. Может кто-нибудь объяснить мне это, пожалуйста?Почему переменная в моем компоненте знает, когда значение изменяется в сервисе?Какая часть отвечает за это?

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Итак, каждый раз, когда вызывается метод updateValues(), он будет выдавать значение суммы, верно?

Да, верно.

Означает ли это, что мое значение будет обновляться при каждом изменении общей суммы?

Да.

Почему переменная в моем компоненте знает, когда значение изменяется вservice?

Поскольку BehaviorSubject простирается от Subject, который простирается от Observable (и реализует SubscriptionLike).Observables работают таким образом, что каждый раз, когда издатели устанавливают новое значение переменной (в данном случае this.sumEmit.next(this.sum)), все подписчики получают уведомление с новым значением.

Подробнее об этом можно прочитать на Angular-Observables и ReactiveX-Observable

Какая часть отвечает за это?

Эта

this.sumEmit.next(this.sum);

Дополнительные примечания

  • Почему это работает, если мы не используем .subscribe?

Поскольку свойство value может бытьдоступ в любое время, отличительная черта BehaviorSubject с (см. это обсуждение ).Это отличается от Subject или Observable, где вы начинаете получать значения, только если вы подписываетесь на их потоки.

Мы можем получить доступ к значению, используя метод getValue, то есть: let theValue = this.SharedService.getTotal().getValue().Кроме того, если мы присвоим BehaviorSubject переменной (назовем ее val) и используем эту переменную, то есть с каналом async, значение автоматически извлекается этим каналом, и вы 'Вы увидите, что пользовательский интерфейс обновляется автоматически, без необходимости подписываться на поток (канал сделает это за вас).Например:

// component.ts
this.val = this.SharedService.getTotal(); // val is a `BehaviorSubject`

// component.html
{{ val | async }}
  • Если я хочу подписаться, могу ли я изменить BehaviorSubject на Observable?

Вам не нужно менять на Наблюдаемый взаказать подписку.Вы также можете подписаться на BehaviorSubject так же, как и на Observable.Если вы хотите получить BehaviorSubject как Observable, вам просто нужно сделать: const myObservable: Observable = myBehaviorSubject.asObservable();

  • Какой из них лучше: BehaviorSubject или Observable?

Нельзя сказать, что одно лучше другого, просто они ведут себя по-разному в некоторых аспектах.Вам нужно применить один или другой в зависимости от ситуации.В общем, BehaviorSubjects полезны для представления «значений во времени».Например, потоком дней рождения является субъект, но потоком возраста человека будет BehaviorSubject (см. BehaviorSubject раздел в RxJS-Overview ).

Дополнительные показания

0 голосов
/ 24 октября 2018

Как переменная в моем компоненте знает, когда значение изменяется в сервисе?

Вы используете BehaviourSubject. Это означает, что новые подписчики всегда будут получать последнее значение, генерируемое синхронно.

Какая часть отвечает за это?

this.sumEmit.next(this.sum);

...