AngularJS和RxJS以canActivate为主题头痛

时间:2017-05-14 05:29:14

标签: angularjs rxjs subject

我使用firebase获得了一个示例AngularJS2项目。 authService使用的方法isAuthentificated with subject,返回subject.asObserveable。

该方法被调用两次:

    带有subscribe的头组件构造函数中的
  • ,它将返回的值传递给变量

  • 在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之外设置一个私有变量来解决这个问题,这可行。

我真的很想了解这种不同的行为的原因。希望有人能够让我感到高兴,谢谢。

1 个答案:

答案 0 :(得分:0)

您不仅可以在canActivate方法中返回布尔值,还可以返回Observable或Promise:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
    return this.authService.isUserAuthenticated.isAuthenticated();
}