Angular 可观测系统内的角度重定向

Angular 可观测系统内的角度重定向,angular,redirect,rxjs,Angular,Redirect,Rxjs,我使用Angular 4作为自定义组件,只在一个页面上上传音频(这不是SPA)。文件上载后,我想将浏览器重定向到页面http://website/profile/tracks 我的服务电话如下所示: this.uploadService.uploadTrack(this.trackForm, csrfToken).subscribe(res => { this.redirectToTracks(); this.loading = false; }, err => { th

我使用Angular 4作为自定义组件,只在一个页面上上传音频(这不是SPA)。文件上载后,我想将浏览器重定向到页面
http://website/profile/tracks

我的服务电话如下所示:

this.uploadService.uploadTrack(this.trackForm, csrfToken).subscribe(res => {
  this.redirectToTracks();
  this.loading = false;
}, err => {
  this.loading = false;
});
上载服务:

uploadTrack(track, csrfToken): Observable<any> {
  const headers = new HttpHeaders().set('Csrf-Token', csrfToken);
  return this.http.post('/profile/upload', track,  {headers: headers});
}
但它不起作用,似乎Angular将其称为后台请求:

如果我把console.log(res)放在subscribe中,它会在那里记录重定向


但是如果我把重定向放在ngOnInit()中,它就工作得很好

解决方案是使用NgZone:

constructor(private utilsService: UtilsService,
              private uploadService: UploadService,
              private zone: NgZone,
              ){ ... }

this.uploadService.uploadTrack(this.trackForm, csrfToken).subscribe(
    res => {
      this.loading = false;
      this.zone.runOutsideAngular(() => {
        window.location.href = '/profile/tracks';
      });
    }, 
    err => {
      this.loading = false;
    });
);

解决方案是使用NgZone:

constructor(private utilsService: UtilsService,
              private uploadService: UploadService,
              private zone: NgZone,
              ){ ... }

this.uploadService.uploadTrack(this.trackForm, csrfToken).subscribe(
    res => {
      this.loading = false;
      this.zone.runOutsideAngular(() => {
        window.location.href = '/profile/tracks';
      });
    }, 
    err => {
      this.loading = false;
    });
);