在我的组件的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之后它仍然停止工作。我是否正确地解决了这个问题?
答案 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”可能是可选的。
希望这有帮助。