1

我正在尝试使用路由保护来检查我在访问路由之前是否登录了用户。为此,如果用户登录,我有一个 replaySubject 包含 true。当我调用我的方法来检查用户是否登录时,它的值为 true,但是当在 canActivate 方法中调用相同的方法时,它的值为空,所以它确实不返回任何东西。

canActivate方法:

//inside AuthService
canActivate(route: ActivatedRouteSnapshot,state: RouterStateSnapshot): Observable<boolean> {
  return this.isLoggedIn();
}

isLoggedIn方法:

//inside AuthService
isLoggedIn() {
return this.loggedIn
  .first()
  .do(user => {
    console.log(user);
  })

}

loggedIn主题:

//inside AuthService
loggedIn: Subject<boolean> = new ReplaySubject<boolean>(1);

链接:

<a (click)="checkLogin()" [routerLink]="['/table']">some text</a>

checkLogin方法:

checkLogin() {
this.auth
  .isLoggedIn()
  .toPromise()
  .then(data => {
    // this returns true
    console.log("login status is", data);
  });
}

路由模块:

const appRoutes: Routes = [
  { path: "home", component: HomeComponent },
  { path: "table", component: TableComponent, canActivate: [AuthService] },
  { path: "", redirectTo: "/home", pathMatch: "full" }
];

角度版本:5.2.8,角度路由器版本:5.2.8

4

1 回答 1

0

谢谢皮埃尔为我指明了正确的方向

原来我在我的应用程序组件和我的应用程序模块中都提供了我的身份验证服务,这反过来又导致我在应用程序中有两个身份验证服务实例,一个用于我的组件,一个用于我的模块。

我刚刚从应用程序组件中删除了该服务并且它有效

于 2018-04-17T13:03:54.510 回答