如果Resolve失败,则重定向Angular 2

Fer*_*oli 18 angular2-routing angular

如果Angular 2中的解析失败,如何重定向到另一个页面?我将此解析称为我的编辑页面,但我想处理Resolve页面中的错误

我的决心:

 resolve(route: ActivatedRouteSnapshot): Promise<any>|boolean {

        return new Promise((resolve, reject) => {

            if (route.params['id'] !== undefined) {
                this.dataService.getHttpEmpresaShow(this.endpoint_url_Get + route.params['id'])
                    .subscribe(
                     result => {                    
                            console.log("ok");
                            return resolve(result);                     
                    },
                    error => {
                return resolve(error);
            });
    }});
Run Code Online (Sandbox Code Playgroud)

n00*_*dl3 29

就像在文档中一样,调用this.router.navigate(["url"])...(想想Router在你的构造函数中注入)

class MyResolve {

  constructor(private router: Router) {}

  resolve(route: ActivatedRouteSnapshot): Observable <any> {
    return this.dataService.getHttpEmpresaShow(this.endpoint_url_Get + route.params['id'])
      .pipe(catchError(err => {
        this.router.navigate(["/404"]);
        return EMPTY;
      }));
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 拥有**/404**路线真的不方便!理想情况下,我们应该能够保留原始URL(例如posts/some-missing-id)并显示错误组件而不是原始处理程序组件.有没有办法实现这样的机制来(全局)处理解决方案中的错误? (7认同)
  • 这是一个不好的做法。我从未见过后端 Web 服务器重定向到专用的 404 网页。那么为什么要在前端这样做呢? (3认同)
  • 我想你不明白这里做了什么.如果您有一个用于显示单个项目的路由器插座,并且当您找不到该项目时,您将在同一位置显示404消息而不更改该URL.这就是你谈到的确切行为!你只需要将`{skipLocationChang:true}`作为选项传递给`router.navigate(url,options)`.@cgTag (3认同)
  • @ n00dl3,您自己尝试过吗?在数据解析器的情况下,skipLocationChang:true不起作用,我不知道为什么。如果您访问的URL是第一个URL,但已解析的URL无法解析数据并重定向到404,则原始URL未保存,并且始终只是没有路径的“ /”根URL,this.router.navigate(['404'],{ skipLocationChange:true}); 没有帮助。Angular4。不确定这是路由器的错误还是功能... (2认同)