У меня есть два компонента, которые внедряют один и тот же сервис.Один компонент должен функционировать независимо от другого компонента, но может быть добавлен к другому компоненту в любое время, и оба компонента нуждаются в одних и тех же данных.Я хочу избежать загрузки данных дважды (т. Е. Просто загрузить их один раз, независимо от того, какой компонент запросил данные).
Общая служба:
@Injectable()
export class UserDetailsService {
private userDetailsSubject: BehaviorSubject<UserDetails> = new BehaviorSubject<UserDetails>(new UserDetails());
public currentModel: Observable<UserDetails> = this.userDetailsSubject.asObservable();
constructor(private userDetailsRepository: UserDetailsRepository) {}
public loadUserDetails(id: string) {
// loadUserDetails makes a HttpClient get call which returns the result as an Observable
this.userDetailsRepository.loadUserDetails(id)
.subscribe(details => this.userDetailsSubject.next(details));
}
}
Первый компонент:
export class UserLookupComponent implements OnInit {
// Other logic ...
// The user is loaded via lookup.
public user: User;
constructor(private detailsService: UserDetailsService) {}
public loadUserDetails() {
this.detailsService.loadUserDetails(user.id);
}
ngOnInit() {
this.detailsService.currentModel.subscribe(details => {
this.user.details = details;
});
}
// Other logic...
}
Второй компонент практически идентичен первому компоненту с другой логикой, соответствующей его назначению.По сути, это компонент Overview, который должен получать информацию для пользователя, если он еще не загружен с помощью this.detailsService.loadUserDetails(user.id)
, и устанавливать данные пользователя с помощью this.detailsService.currentModel.subscribe...
точно так же, как первый компонент.
Однако проблема заключается в том, что данные запрашиваются дважды, и я хочу избежать такого поведения и загружать данные только один раз.Я попытался установить тему Subject<string>
и добавить debounceTime
и mergeMap(id => this.userDetailsRepository.loadUserDetails(id))
в currentModel, но происходит то же самое.Как я могу получить данные только один раз?
Я должен также отметить, что пользователь извлекается и настраивается с использованием другой службы.Эта услуга также используется обоими компонентами (так что они могут получить одного и того же пользователя).