Вы можете использовать ReplaySubject или BehaviorSubject , чтобы заставить это работать, если вы используете ReplaySubject, вам нужно указать, сколько старых значений вы хотите сохранить, чтобы подписчики могли получить доступ позже, BehaviorSubject можетоставьте только последнее значение
import { ReplaySubject } from 'rxjs';
....
@Injectable()
export class SharedService {
plans$: Observable<Plan[]> = this.plansSubject.asObservable();
private plansSubject = new ReplaySubject<Plan[]>(1);
constructor(private http: HttpClient) { }
getPlans(){
this.http.get().subscribe(res => this.plansSubject.next(res.plans)); // get array of plans
}
}
, и вы можете получить данные в своих компонентах следующим образом:
constructor(private sharedService: SharedService) { }
ngOnInit() {
this.sharedService.getPlans(); // to get called only the first time to get data
this.service.plans$.subscribe(...); // you have your data here without anu additional http call
}
и, если вы хотите обновить данные, вы можете вызвать метод
this.sharedService.getPlans();
для BehaviorSubject это точно то же самое, здесь что изменится
plans$: Observable<Plan[]> = this.plansSubject.asObservable();
private plansSubject = new BehaviorSubject<Plan[]>;
вы можете подписаться внутри своего компонента, чтобы получить данные, или вы можете получить доступиспользуя BehaviorSubject.value
constructor(private sharedService: SharedService) { }
ngOnInit() {
this.service.plans$.subscribe((plans) => console.log(plans));
// or access the value directly
console.log(this.service.plans$.value)
}