我正在使用Angular 5并遇到以下问题:
我有一个包含参数年份的路线。相关组件现在应显示由服务检索的该年份的数据。首次路由到这样的URL时,这很好。如果我更改参数year,则不会重新加载组件(如预期的那样),只会再次调用OnInit()。在这种方法中,我尝试通过调用新年的服务方法来重新加载数据,但它不起作用。这是我的代码:
test.component.ts:
public ngOnInit() {
this.route.paramMap.subscribe( params => {
if (params.has('year')) {
this.loadData(params.get('year'));
} else {
this.loadData();
}
});
}
public loadData(year?: string): void {
this.testService.getData(year).subscribe(data => {
// edit and set to variables
});
}
test.service.ts:
public getData(year) {
return Observable.forkJoin(
this.getPart1(year),
this.getPart2(year)
);
}
private getPart1(year): Observable<CustomObject[]> {
let url = this.baseUrl;
if (year) url = url.concat("?year=" + year);
return this.http.get<CustomObject[]>(url, httpOptions).pipe(
catchError(this.handleError<CustomObject[]>())
)
}
private getPart2(year): Observable<OtherCustomObject[]> {
let url = this.baseUrl + '/path';
if (year) url = url.concat("?year=" + year);
return this.http.get<OtherCustomObject[]>(url, httpOptions).pipe(
catchError(this.handleError<OtherCustomObject[]>())
)
}
如何强制Observable重新加载HTTP请求?我尝试使用(重播)主题而不是Observables,但这不起作用。
非常感谢任何帮助:)
答案 0 :(得分:2)
您可以switchMap
使用//First of all, create your reloader subject
reloader$ = new BehaviorSubject(null);
//Then connect it to your observable
public getData(year) {
return this.reloader$.switchMap(() => Observable.forkJoin(
this.getPart1(year),
this.getPart2(year)
));
}
:
BehaviorSubject
因为这是null
,所以第一个调用就像魅力一样,因为它会将public reload(){
this.reloader$.next(null);
}
作为第一个值。
然后,您可以创建一个基本的reload()方法:
reloader$
因为这会使session_start
observable发出一个新值,所以可以再次触发可观察链的其余部分,从而产生重新加载数据的新请求。