2017-10-08 49 views
1

在Angular中,我了解如何使用通配符路由来显示自定义404页面。但是,这只涵盖了不存在组件的情况。Angular 4:找不到处理ID

用户到达现有组件但是传递了不存在ID的情况如何?

例如/widgets/12345其中12345在数据库中不存在。 这种情况下显示404的最佳做法是什么?

我设法通过捕获错误将用户重定向到404页面。但是这看起来并不正确:你通常不会被重定向到404,你希望保持在同一个URL上,而是使用404页面。

回答

0

如果在角度上有可能发送404状态错误,那么处理这种类型的情况会更容易。 但是,在角度上,返回404状态错误没有意义,因为在浏览组件时,您实际上并未发出任何http请求。

要解决这个问题,你可以使用Angular resolveRouter Guards找出路由数据id是否存在。如果它不存在,则重定向到您的404页面

@Injectable() 
export class checkIdExistence implements CanActivate { 

    constructor(private router: Router, 
       private route: ActivatedRoute, 
       private yourService: YourService) { 
    } 

    canActivate(route: ActivatedRouteSnapshot, routerState: RouterStateSnapshot) 
    { 
     return this.route.params 
      .mergeMap(
      (params: Params) => { 
       const newId = params['id'] ? +params['id'] : ''; 
       return this.yourService.checkExistence(newId) 
        .map((myInstance: any) => { 
         if (myInstance && myInstance.id) { 
         return true; 
         } 
         this.router.navigate(['/404-url']); 
         return false; 
        }) 
        .catch(() => Observable.of(false)); 
     }); 

    } 
} 
+0

“你实际上并没有在浏览组件时发出任何http请求” - 不知道我是否得到了这个。我要去'/ widgets/12345',它会触发我的服务,这会触发对我的服务器API的HTTP请求,这会返回一个404错误。 –

+0

你的代码包含'this.router.navigate(['/ 404-url']);',这意味着你正在手动重定向到404页面,这意味着URL栏将更改为'/ 404-url'正确吗?如果是这样,它不能解决问题,我已经有这样的实施... –