我正在使用我的服务中的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();
}
非常感谢:)
答案 0 :(得分:1)
当您“返回”组件时,将执行ngOnInit()中的所有内容。您可以将数据放入服务中的变量中,然后在ngOnInit()上检查服务中是否有任何数据,如果没有,请不要再次从服务器请求它们。
if(myservice.data) {
do nothing}
else {
myservice.data = this.apiService.fetchData();}