То, что вы можете сделать в своем сервисе, это использовать BehaviourSubject для хранения значений, но представить его как Observable.
Вот цитата из документов, подробно описывающая, что такое BehaviourSubject
Одним из вариантов Subjects является BehaviorSubject, который имеет понятие «текущее значение».Он хранит последнее значение, отправленное его потребителям, и всякий раз, когда подписывается новый Observer, он сразу же получает «текущее значение» от BehaviorSubject
См. здесь для получения дополнительной информации.
Сервисный код:
private _user$ = new BehaviourSubject<any>(null); // initially null
constructor(private http: HttpClient, private router: Router) {
this.userChangeSet.subscribe(val => this._user$.next(val))
}
get user$ () {
return this._user$.asObservable();
}
Тогда вы можете использовать его как обычный компонент в вашем компоненте.
this.service.user$.subscribe(v => {
// do stuff here
})
Обратите внимание, что первое значение, которое получит компонент, будет нулевым, поскольку это начальное значение объекта BehaviourSubject.
РЕДАКТИРОВАТЬ:
В компоненте
private _destroyed$ = new Subject();
public ngOnDestroy (): void {
this._destroyed$.next();
this._destroyed$.complete();
}
И затем для подписки
this.service.user$.pipe(
takeUntil(this._destroyed$)
).subscribe(v => {
// do stuff here
})
Это работает так, что когда испускается уничтоженный $ subject, наблюдаемые, которые передали takeUntil(this._destroyed$)
, будутотписаться от соответствующих источников.