angular - CanActivate 的行为与 Angular 7 与 firebase 的行为不符
问题描述
在我的Authservice
,我有:
getAuthenticationState(): Observable<any> {
return this.angularFireAuth.authState;
}
在我的Guard
:
canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | boolean {
// In case of refresh
return this.authService.getAuthenticationState()
.pipe(map(user => !!user))
.pipe(tap(loggedIn => {
console.log(loggedIn);
if (!loggedIn) {
this.router.navigate(['/admin/login']);
} else {
return true;
}
}));
}
我的问题是我必须单击登录按钮两次(我确定它已按应有的方式实现),看来 Guard 没有作为 Observable 工作,loggedIn值只打印一次。
解决方案
添加 take(1) 来解决它以及为什么使用 2 个管道,将其更改为
return this.authService.getAuthenticationState()
.take(1)
.pipe(
map(user => !!user),
tap(loggedIn => {
console.log(loggedIn);
if (!loggedIn) {
this.router.navigate(['/admin/login']);
} else {
return true;
}
})
);
推荐阅读
- java - 无法从 Java 中读取 C++ 中保存的 Opencv Mat 图像
- c# - Json.NET - 在 winforms 中反序列化和解析 json 数据
- oracle - 登录sqlplus并在dockerfile中执行sql文件
- xslt-2.0 - XML合并两个文件不起作用
- python - 如何根据每日价格数据计算月收益?
- mediawiki - Mediawiki 的导航框模板未在个人 wiki 中显示框
- c# - 在我的 ASP.Net MVC 应用程序中,我真正需要多少个连接字符串?
- node.js - 谷歌表格客户端未定义节点
- kendo-ui - 从下拉列表中过滤剑道网格列
- java - 带有 envers 的应用程序在模式验证上失败:REV 列的类型错误 - 找到 [int8 (Types#BIGINT)],但期望 [int4 (Types#INTEGER)]