当前位置: 首页 > 知识库问答 >
问题:

角2-路由-CanActivate工作与观察

燕文昌
2023-03-14

我有一个实现CanActivate的AuthGuard(用于路由)。

canActivate() {
    return this.loginService.isLoggedIn();
}

我的问题是,CanActivate结果依赖于超文本传输协议-get结果-登录服务返回一个可观察的。

isLoggedIn():Observable<boolean> {
    return this.http.get(ApiResources.LOGON).map(response => response.ok);
}

我如何将它们结合在一起-使CanActivate依赖于后端状态?

编辑:请注意,这个问题是从2016年开始的-已经使用了角度/路由器的一个非常早期的阶段。

共有3个答案

丌官远
2023-03-14

canActivate()接受可观察的

您可以使用. map运算符来转换可观察的

canActivate(){
    return this.http.login().map((res: Response)=>{
       if ( res.status === 200 ) return true;
       return false;
    });
}

屠钊
2023-03-14

更新Kery Hu对Angular 5和RxJS 5.5的回答,其中catch操作符不受欢迎。现在,您应该将catchError操作符与管道和出租操作符结合使用。

import { Injectable } from '@angular/core';
import { CanActivate, Router, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs/Observable';
import { catchError, map} from 'rxjs/operators';
import { of } from 'rxjs/observable/of';

@Injectable()
export class AuthGuard implements CanActivate {

  constructor(private loginService: LoginService, private router: Router) { }

  canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean>  {
    return this.loginService.isLoggedIn().pipe(
      map(e => {
        if (e) {
          return true;
        } else {
          ...
        }
      }),
      catchError((err) => {
        this.router.navigate(['/login']);
        return of(false);
      })
    );
  }   
  
}
太叔英卫
2023-03-14

您应该将“@angular/router”升级到最新版本。e、 g.“3.0.0-alpha.8”

修改AuthGuard。ts

@Injectable()
export class AuthGuard implements CanActivate {
    constructor(private loginService: LoginService, private router: Router) {}

    canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
        return this.loginService
            .isLoggedIn()
            .map((e) => {
                if (e) {
                    return true;
                }
            })
            .catch(() => {
                this.router.navigate(['/login']);
                return Observable.of(false);
            });
    }
}

如果你有任何问题,问我!

 类似资料:
  • 我正在尝试使用http.get从服务器检索json文件,并从组件订阅可观察的内容。但是,它返回的是一个错误,而不是数据。 你能告诉我哪里出了问题吗: 下面是组件: 我正在使用Angular和rxjs库的最新版本。 请帮忙。

  • 我正在使用Yoeman Angular软件包构建一个Angular前端站点。该项目正使用节点托管在Heroku中。js构建包。 Heroku构建项目时没有错误,它运行Gulp和Bower来安装依赖项。执行启动脚本并编译项目后,索引页面加载不会出现问题,但任何其他非主页的页面(例如登录页面)都会出现“无法获取/登录”消息。 这似乎是一个常见的问题,因为我读过许多关于如何解决Heroku上的Angul

  • 我正在尝试运行混合应用程序,即角度2组件。以下是我为运行混合应用程序所做的设置,我能够运行应用程序,并且“my-app”组件也在此混合应用程序中初始化,但是当我尝试使用route(“/first”)访问组件(FirstComponent)时,它会加载FirstComponent,但会自动重定向到我的默认角度1路由。 index.html app.component.ts app.module.ts

  • 是否可以在 Angular 2 路由中具有可选的路由参数?我在RouteConfig中尝试了Angular 1.x语法,但收到以下错误: “原始异常:路径“/ user /: id ?“包含”?

  • 2.1 原生koa2实现路由 2.2 koa-router中间件