我有一个实现CanActivate的AuthGuard(用于路由)。
canActivate() {
return this.loginService.isLoggedIn();
}
我的问题是,CanActivate结果依赖于超文本传输协议-get结果-登录服务返回一个可观察的。
isLoggedIn():Observable<boolean> {
return this.http.get(ApiResources.LOGON).map(response => response.ok);
}
我如何将它们结合在一起-使CanActivate依赖于后端状态?
编辑:请注意,这个问题是从2016年开始的-已经使用了角度/路由器的一个非常早期的阶段。
canActivate()接受可观察的
您可以使用
. map
运算符来转换可观察的
canActivate(){
return this.http.login().map((res: Response)=>{
if ( res.status === 200 ) return true;
return false;
});
}
更新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);
})
);
}
}
您应该将“@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中间件