【发布时间】:2019-04-23 14:46:20
【问题描述】:
我有一个包含多个选项卡的组件:tab1、tab2、tab3。选项卡之间的导航是按路线进行的。 tab1 是用户访问页面时处于活动状态的默认选项卡。 tab3 需要 API 调用来获取要显示的数据。我想在WrapperComponent(这些选项卡上方的包装器)的解析器中将此数据加载到后台,以防止长时间加载tab3。当用户通过包含tab3 的url 加载页面时,我还有tab3 的解析器。当用户导航tab3 时,我想等待数据加载,不要再次调用它。
所以我有服务:
@Injectable({
providedIn: 'root'
})
export class DataStorageService {
fetchData(requestId: string): void {
this.data= this.reportsApi.getData(requestId).pipe(shareReplay(1));
}
getData(): Observable<data[]> {
return this.data;
}
}
所以在WrapperComponent 的解析器中,我调用DataStorageService.fetchData 开始在后台加载数据。
在tab3 的解析器中,我只是从服务返回this.data:
resolve(route: ActivatedRouteSnapshot) {
return this.DataStorageService.getData();
}
除了初始数据加载外,它工作正常。所以当我在tab1 上加载页面时,数据并没有开始加载。我在fetchData 中添加了一行来修复它:
fetchData(requestId: string): void {
this.data= this.reportsApi.getData(requestId).pipe(shareReplay(1));
this.data.subscribe(v => v);
}
但这似乎不正确。我也尝试以这种方式使用BehaviorSubject、ReplaySubject:
fetchData(requestId: string): void {
this.reportsApi.getData(requestId).subscribe(data => this.data = data)
}
并将asObservable 传递给解析器,但这也不是成功的。我该如何实现?
【问题讨论】:
标签: javascript angular rxjs