角度路由paramMap switchMap在404之后停止工作

时间:2017-08-31 14:33:27

标签: angular rxjs angular-routing

在我的组件的ngOnInit中,我正在使用documentation中建议的paramMap重新使用组件,但根据路由中提供的用户ID进行切换:

    this.route.paramMap
        .switchMap((params: ParamMap) => {
            this.errors = false;
            this.busy = true;
            return this.userService.getUser(params.get('id'));
        })
        .subscribe((user) => {
            this.busy = false;
            this.errors = false;
            // do something with user object...
          }, (error) => {
            this.busy = false;
            this.errors = true;
            if (error.status === 404) {
                this.errorMsg = 'User not found';
            }
        });

但是,只要userService.getUser()方法抛出404错误,.switchMap()会在路径参数更改时停止触发,例如,新的用户ID。我已经尝试将.catch()投入到服务和组件中,但它似乎没有效果,并且在404之后它仍然停止工作。我是否正确地解决了这个问题?

3 个答案:

答案 0 :(得分:1)

我在使用Angular Heroes应用程序时遇到同样的问题,通过导入switchMap操作符解决了问题。

import 'rxjs/add/operator/switchMap';

答案 1 :(得分:0)

我有同样的问题,即使我订阅了activateRoute observables,他们只触发一次,所以我必须这样做



router.events.subscribe(event:Event => {
    if(event instanceof NavigationEnd) {
   // your route code here
   this.route.paramMap
        .switchMap((params: ParamMap) => {
            this.errors = false;
            this.busy = true;
            return this.userService.getUser(params.get('id'));
        })
        .subscribe((user) => {
            this.busy = false;
            this.errors = false;
            // do something with user object...
          }, (error) => {
            this.busy = false;
            this.errors = true;
            if (error.status === 404) {
                this.errorMsg = 'User not found';
            }
        });
    }
    })




答案 2 :(得分:0)

注意 - 几个月前我刚开始使用Angular。

但是,我认为以下内容将解决您的问题(我认为使用switchmap的重点是删除订阅)。

尝试以下方法:

user$: Observable<user>;

user$ = this.route.paramMap
        .switchMap(params => {
            this.errors = false;
            this.busy = true;
            return this.userService.getUser(params.get('id'));
        })
        .do(next => {
            this.busy = false;
            this.errors = false;
            // do something with user object...
          })
        .catch(error => {
            this.busy = false;
            this.errors = true;
            if (error.status === 404) {
                this.errorMsg = 'User not found';
            }
            return Observable.of(null);
        });

然后,在您的模板中,使用如下的异步管道:

( user$ | async ) as user

根据您的使用情况,“as user”可能是可选的。

希望这有帮助。