You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Angular 4授权失败跳转首页后页面空白问题求助

解决Angular AuthGuard返回false时页面白屏的问题

看起来你遇到的问题是:当AuthGuard返回false时,地址栏虽然切换到了首页,但页面没有加载对应的组件,需要手动刷新才行。这是因为直接return false只会阻止当前路由的激活,但不会让Angular正确触发首页的导航流程。

给你两种可行的解决方案,推荐第二种更符合Angular的最佳实践:

方案一:手动导航后返回false

修改你的AuthGuard代码,在else分支里先调用router.navigate跳转到首页,再返回false阻止原路由:

export class AuthGuard implements CanActivate { 
  constructor (private serwis: SerwisService, private router: Router) {} 
  canActivate( next: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean { 
    if (this.serwis.login === true) { 
      return true; 
    } else { 
      // 手动触发首页导航
      this.router.navigate(['/']);
      // 阻止原路由的激活
      return false; 
    }
  }
}

方案二:返回UrlTree(推荐)

从Angular 7开始,CanActivate守卫支持返回UrlTree类型,Angular会自动根据这个UrlTree完成导航,同时阻止原路由。这种方式更简洁且符合官方规范:

import { UrlTree } from '@angular/router';

export class AuthGuard implements CanActivate { 
  constructor (private serwis: SerwisService, private router: Router) {} 
  // 修改返回值类型为 boolean | UrlTree
  canActivate( next: ActivatedRouteSnapshot, state: RouterStateSnapshot): boolean | UrlTree { 
    if (this.serwis.login === true) { 
      return true; 
    } else { 
      // 返回首页的UrlTree,Angular会自动处理导航
      return this.router.createUrlTree(['/']); 
    }
  }
}

问题原因说明

当你直接return false时,Angular仅仅是拒绝了当前要激活的路由,但没有启动新的导航流程——虽然你可能手动修改了地址栏,但Angular的路由系统没有感知到这个变化,所以不会加载首页组件。而上面两种方式都是让路由系统主动触发首页的导航,这样组件就能正常加载,不会出现白屏的情况。

另外还要确认你的首页路由配置是正确的,并且没有其他守卫阻止首页的访问哦。

内容的提问来源于stack exchange,提问作者Wojtar

火山引擎 最新活动