Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度4:未找到处理ID_Angular_Http Status Code 404_Url Routing - Fatal编程技术网

Angular 角度4:未找到处理ID

Angular 角度4:未找到处理ID,angular,http-status-code-404,url-routing,Angular,Http Status Code 404,Url Routing,在Angular中,我了解如何使用通配符路由来显示自定义404页面。但是,这仅适用于不存在组件的情况 如果用户访问了一个现有组件,但传递了一个不存在的ID,那么情况会怎样 例如,数据库中不存在/widgets/12345,其中12345。 在这种情况下,展示404的最佳实践是什么 通过捕获错误,我成功地将用户重定向到404页面。但这似乎并不正确:您通常不会被重定向到404,您希望停留在同一个URL上,而是使用404页面。如果在angular中可以发送404状态错误,那么处理这种情况会更容易。 但

在Angular中,我了解如何使用通配符路由来显示自定义404页面。但是,这仅适用于不存在组件的情况

如果用户访问了一个现有组件,但传递了一个不存在的ID,那么情况会怎样

例如,数据库中不存在
/widgets/12345
,其中
12345
。 在这种情况下,展示404的最佳实践是什么


通过捕获错误,我成功地将用户重定向到404页面。但这似乎并不正确:您通常不会被重定向到404,您希望停留在同一个URL上,而是使用404页面。

如果在angular中可以发送404状态错误,那么处理这种情况会更容易。
但是,在angular中,没有必要返回404状态错误,因为在angular中,您在浏览组件时实际上没有发出任何http请求

要解决此问题,可以使用查找路由数据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));
         });

    }
 }

“在浏览组件时,您实际上没有发出任何http请求”-我不确定我是否明白这一点。我将转到
/widgets/12345
,它将触发我的服务,它将触发对我的服务器API的HTTP请求,并返回404错误。您的代码包括
this.router.navigate(['/404 url'])
,表示您正在手动重定向到404页面,表示URL栏将更改为
/404 URL
正确吗?如果是这样,这并不能解决问题,我已经有了这样一个实现。。。