You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 16中如何通过依赖注入使用CanActivateFn函数式守卫

Angular 16 函数式路由守卫(CanActivateFn)的依赖注入实现

在Angular 16的函数式路由守卫里,不再通过构造函数注入依赖,而是直接用Angular提供的inject()函数来获取所需服务,这也是官方推荐的写法。

你的代码其实已经实现了依赖注入,但可以优化写法,避免在操作符回调里重复调用inject():

优化后的守卫代码

export const authGuard: CanActivateFn = (
  next: ActivatedRouteSnapshot,
  state: RouterStateSnapshot
) => {
  // 提前注入所需服务,避免在操作符内重复调用
  const tokenService = inject(TokenService);
  const router = inject(Router);

  return tokenService.authenticated.pipe(
    take(1),
    map((status) => {
      console.log('auth status: ', status);
      if (!status) {
        return router.createUrlTree(['/login']);
      }
      return true;
    })
  );
};

关键说明

  • inject()函数是Angular的依赖注入API,只能在注入上下文中调用,而函数式守卫的执行逻辑正好处于这个上下文内,所以可以直接使用。
  • 建议在函数顶部集中注入所需服务,不要在map这类操作符的回调里重复调用inject()——虽然语法允许,但会降低代码可读性,也不符合最佳实践。
  • 你的路由配置写法是正确的,直接把authGuard作为数组项传入canActivate即可,无需额外调整。

路由配置(保持原写法即可)

const routes: Routes = [
  {
    path: '',
    component: DefaultComponent,
    canActivate: [authGuard],
    children: [
      {
        path: '',
        component: DashboardComponent,
        data: { title: 'My Dashboard' },
      },
    ]
  }
];

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 09:37:05