我使用firebase获得了一个示例AngularJS2项目。 authService使用的方法isAuthentificated with subject,返回subject.asObserveable。
该方法被调用两次:
,它将返回的值传递给变量
在canActivate中带有first()的路由器防护中。 示例项目按预期工作。
我在没有FirebaseAPI的情况下用自己的东西重新打开它,它在标题组件中按预期工作,但在路由器防护中我总是得到一个空对象。如果我像示例项目一样使用它,路由器停止工作,所以我修改它,看看会发生什么。 这是authService的代码:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
let pass: boolean = false;
const val = this.authService.isAuthenticated().first();
val.subscribe((x:boolean) => {
console.log('Guard says: ' + x);
pass = x;
});
// return val;
return pass;
}
这是守卫的代码:
isAuthenticated() {
const state = new Subject<boolean>();
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
state.next(true);
} else {
state.next(false);
}
});
return state.asObservable();
}
示例项目只有:return this.authService.isAuthenticated()。first(); 我看不出逻辑上的任何差异,并且想要了解,我在这里缺少什么。
谢谢
PS。与守卫一起工作的代码如下:
canActivate
}
经过一些更多的测试,我可以观察到,L =["directory1", "directory2", "directory3"]
for i in range(len(L)):
#I know this is wrong, but just to give an idea
myPath = "parent."+L[i]
from myPath import file
#make file... etc.
在我的项目中更新主题后立即运行,这在示例项目中不会发生(尽管主题也在那里更新)。唯一的区别是示例使用Firebase的观察者,我使用ng2-webstorage中的观察者。我可以通过在canActivate之外设置一个私有变量来解决这个问题,这可行。
我真的很想了解这种不同的行为的原因。希望有人能够让我感到高兴,谢谢。
答案 0 :(得分:0)
您不仅可以在canActivate方法中返回布尔值,还可以返回Observable或Promise:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.authService.isUserAuthenticated.isAuthenticated();
}