Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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 2_Angular_Angular2 Routing - Fatal编程技术网

如果解析失败,则重定向Angular 2

如果解析失败,则重定向Angular 2,angular,angular2-routing,Angular,Angular2 Routing,如果解析在Angular 2中失败,如何重定向到另一页? 我为我的编辑页面调用此解析,但我想处理解析页面中的错误 我决心: resolve(路由:ActivatedRouteSnapshot):Promise |布尔值{ 返回新承诺((解决、拒绝)=>{ if(route.params['id']!==未定义){ this.dataService.getHttpEmpresaShow(this.endpoint\u url\u Get+route.params['id']) .订阅( 结果=>{

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

我决心:

resolve(路由:ActivatedRouteSnapshot):Promise |布尔值{
返回新承诺((解决、拒绝)=>{
if(route.params['id']!==未定义){
this.dataService.getHttpEmpresaShow(this.endpoint\u url\u Get+route.params['id'])
.订阅(
结果=>{
控制台日志(“ok”);
返回解析(结果);
},
错误=>{
返回解析(错误);
});
}});
就像调用
this.router.navigate([“url”])
..(考虑在构造函数中插入
路由器

类MyResolve{
构造函数(专用路由器:路由器){}
解析(路由:ActivatedRouteSnapshot):可观察{
返回此.dataService.getHttpEmpresaShow(this.endpoint\u url\u Get+route.params['id'])
.pipe(catchError(err=>{
这个.router.navigate([“/404]”);
返回空;
}));
}
}

另一种解决方案,如果您想在所有解析程序发生故障后应用重定向策略,您可以拦截路由器事件并对故障事件应用重定向。您可以在AppComponent中添加以下代码:

import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
import { Router, RouterEvent, NavigationError } from '@angular/router';


@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent implements OnInit {

  constructor(
    private router: Router,
    private cdr: ChangeDetectorRef
  ){}


  ngOnInit() {    
    this.router.events.subscribe((event: RouterEvent) => {
      this.navigationInterceptor(event)
    });
  }

  navigationInterceptor(event: RouterEvent): void {
    if (event instanceof NavigationError) {
      this.router.navigate(["error"],{ queryParams: { redirect: event.url } });
    }
    this.cdr.detectChanges();
  }

}

使用/404路由确实不方便!理想情况下,我们应该能够保留原始url(例如posts/某些缺少的id),并显示错误组件而不是原始处理程序组件。是否有任何方法实现这种机制(全局)在resolve guards中处理错误?使用404路由真的很方便!而不是使用带有
ngIf=“error”的意大利面代码
它是集中式的。如果您想保留url,请查看,这是一种糟糕的做法。我从未见过后端web服务器重定向到专用的404网页。那么为什么要在前端执行此操作呢?我想您不了解在这里执行的操作。如果您有一个路由器插座,用于显示单个项目,并且您不知道何时执行此操作&#如果找不到该项目,则在同一位置显示404消息,而不更改url。这正是您所说的行为!您只需将
{skipLocationChang:true}
作为选项传递到
路由器。导航(url,选项)
@cgTag@n00dl3,您自己尝试过吗?skipLocationChang:true在数据解析程序的情况下不起作用,我不知道为什么。如果您访问的URL是第一个URL,并且解析后无法解析数据并重定向到404,则原始URL未保存,并且始终成为没有路径的“/”根URL,this.router.navigate(['404'],{skipLocationChange:true});没有帮助。Angular 4.不确定这是路由器的错误还是功能…与Github相关的问题:-要求与Angular 7.1中Authguards的等效新功能奇偶校验()