typescript - Begär inte data igen efter att ha använt location.back() i Angular 6 - Är ReplaySubject nödvändigt?


Jag använder BehaviourSubject från min tjänst för att få all data från BackEnd som jag prenumererar på i min mainComponent med hjälp av async-pipen.

Om jag nu navigerar till en annan subkomponent och sedan till exempel klickar på en bakåtknapp (använder Location.back()-funktionen) för att återgå till min huvudkomponent hämtar den alltid all data med en ny förfrågan från backend.

Jag antar att detta kommer från att använda async-pipen eftersom den avprenumererar på BehaviourSubject när man lämnar mainComponent.

Behöver jag implementera någon caching-strategi för detta eller kan detta lösas med en ReplaySubject med storleken på all data jag hämtar från mainComponent?

Nedan är min kod:

Service :

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$;
}

Huvudkomponent :

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>

Underkomponent :

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

Stort tack i förväg :)

Svar #1

Allt du har i ngOnInit() kommer att köras när du "kommer tillbaka" till komponenten. Du kan lägga dina data i en variabel i en tjänst och sedan i ngOnInit() kontrollera om det finns några data i tjänsten, och om det gör det, fråga inte efter dem från en server igen.

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