Angular - 重新加载HTTP请求

时间:2018-02-15 22:10:17

标签: angular typescript http observable

我正在使用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,但这不起作用。

非常感谢任何帮助:)

1 个答案:

答案 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发出一个新值,所以可以再次触发可观察链的其余部分,从而产生重新加载数据的新请求。