Не запрашивать данные снова после использования location.back () в Angular 6 - ReplaySubject необходимо? - PullRequest
0 голосов
/ 12 октября 2018

Я использую BehaviourSubject из своего сервиса для получения всех данных из BackEnd, которые я подписываю в своем mainComponent, используя асинхронный канал.

Если я сейчас направлюсь к другому субкомпоненту, а затем нажму, например, кнопку возврата (использует функцию Location.back ()), чтобы вернуться к моему главному компоненту, он всегда выбирает все данные с новым запросом от BackEnd.

Я полагаю, что это происходит из-за использования асинхронного канала, поскольку он отписывает BehaviourSubject при выходе из mainComponent.

Нужно ли реализовать для этого некоторую стратегию кэширования или это можно решить с помощью ReplaySubject с размеромвсех данных, которые я получаю из mainComponent?

Ниже моего кода:

Сервис:

private subject$: BehaviorSubject<Setting[]> = new BehaviorSubject<Setting[]>([]);

fetchData() {
  const fetch$: Observable <Setting[]> = this.getSettings().pipe(share());
  fetch$.pipe(
      map(allSettings => this.subject$.next(allSettings))
    );
  return fetch$;
}

MainComponent:

data: Observable<Setting[]>;

// Load Setting while starting
ngOnInit() {
  this.data = this.apiService.fetchData();
}

MainComponent.html:

<tr *ngFor="let s of data | async">
  <!--Do Something...-->
</tr>

Подкомпонент:

goBack(): void {
  this.location.back();
}

Заранее большое спасибо:)

1 Ответ

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

Все, что у вас есть в ngOnInit (), будет выполнено, когда вы «вернетесь» к компоненту.Вы можете поместить свои данные в переменную в службе, а затем проверить ngOnInit (), чтобы увидеть, есть ли какие-либо данные в службе и, если они есть, не запрашивать их снова с сервера.

if(myservice.data) {
do nothing}
else {
myservice.data = this.apiService.fetchData();}
...