在Angular 6中使用location.back()之后是否不再请求数据-需要ReplaySubject吗?

时间:2018-10-12 06:32:31

标签: angular typescript caching angular-ui-router

我正在使用我的服务中的BehaviourSubject从后端获取所有数据,这些数据是我使用异步管道在mainComponent中订阅的。

如果我现在路由到另一个子组件,然后单击例如后退按钮(使用Location.back()函数)以返回到我的mainComponent,它将始终从BackEnd获取带有新请求的所有数据。

我想这是由于使用异步管道造成的,因为它在离开mainComponent时取消了BehaviourSubject的订阅。

我是否需要为此实现某种缓存策略,还是可以使用ReplaySubject来解决这个问题,而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 :(得分:1)

当您“返回”组件时,将执行ngOnInit()中的所有内容。您可以将数据放入服务中的变量中,然后在ngOnInit()上检查服务中是否有任何数据,如果没有,请不要再次从服务器请求它们。

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