路由参数在守卫中不可用

Route params not available in guards

为什么id在下面的守卫中不可用?

@Injectable()
export class ProjectDetailsGuard implements CanActivate {

    constructor(private activatedRoute: ActivatedRoute) { }

    canActivate() {
        const id = this.activatedRoute.snapshot.params['id'];

        console.log(id); // <-- undefined
    }

}

相同的代码在组件内部实现时完美运行。

ActivatedRoute只有路由激活后才能提供参数。如果需要在激活之前获取 params 即在 canActivate 方法中,请尝试使用 ActivatedRouteSnapshot

canActivate(activatedRoute: ActivatedRouteSnapshot) {
    const id = activatedRoute.params['id'];

    console.log(id); 
}