Итак, каждый раз, когда вызывается метод 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 ).
Дополнительные показания