Angular 当从组件和保护调用时,不会更新订阅对象

Angular 当从组件和保护调用时,不会更新订阅对象,angular,angular-router,angular-guards,Angular,Angular Router,Angular Guards,如果我的问题看起来很傻,我很抱歉 我尝试在服务中实现behaviorsubject,然后从登录组件调用它 这是我的服务 private currentTokenSubject: BehaviorSubject<AuthResponse>; public currentToken: Observable<AuthResponse>; constructor(private httpClient: HttpClient) { this.currentTokenS

如果我的问题看起来很傻,我很抱歉

我尝试在服务中实现behaviorsubject,然后从登录组件调用它

这是我的服务

private currentTokenSubject: BehaviorSubject<AuthResponse>;
  public currentToken: Observable<AuthResponse>;

constructor(private httpClient: HttpClient) {
    this.currentTokenSubject = new BehaviorSubject<any>(localStorage.getItem(TOKEN_NAME));
    this.currentToken = this.currentTokenSubject.asObservable();
  }

public get currentTokenValue(): AuthResponse {
    // console.log('auth service: ' + this.currentTokenSubject.value)
    return this.currentTokenSubject.value;
  }

  login(usernameOrEmail:string, password: string){
    return this.httpClient.post<any>(this._loginUrl,{usernameOrEmail, password})
      .pipe(map(res => {
        //login sucess if there's jwt token in the response
        if(res && res.accessToken){
          //store user details and jwt token in local storage to keep user logged in between page refresh
          localStorage.setItem(TOKEN_NAME, res.accessToken);
          this.currentTokenSubject.next(res.accessToken);
          console.log(this.currentTokenValue); // It's changed
        }
        return res;
      }));
  }
这是警卫

constructor(
    private router: Router,
    private authService: AuthService
  ){}

  canActivate( next: ActivatedRouteSnapshot, state: RouterStateSnapshot
  ) {
    const currentToken = this.authService.currentTokenValue;
    console.log(currentToken); // return null
    if(currentToken){
      //authorized
      return true;
    }


    // not logged in : redirect to login page with return url
    //console.log(state.url)
    this.router.navigate(['login'], { queryParams : { returnUrl: state.url }});
    return false;
  }
当我尝试登录console.log时,guard返回null

任何人都可以向我解释,为什么会这样

更新

应用程序没有问题,您必须做的是:

仅使用提供商一次


将服务导入app.module.ts中的@ngmodule,否则将创建每个组件/模块的实例。

如果要读取当前值而不是值,则需要在行为主题上使用
.getValue()

public get currentTokenValue(): AuthResponse {
    return this.currentTokenSubject.getValue();
}
更新

应用程序没有问题,您必须做的是:

仅使用提供者一次


将服务导入app.module.ts中的@ngmodule,否则您将创建每个组件/模块的实例。

仍然不工作,我怀疑是警卫根据您提供的代码调用了相同的authservice实例???@AhmadFaruk,是的,它调用了相同的服务。这些服务是单例的,因此能够在其他服务/组件之间共享。如果.getValue()未返回set标记,则需要其他一些console.log()来跟踪并确保.next()正在设置该值。我已经解决了这个问题。因为问题在其他地方,我应该发布答案吗?我想提高投票率,但我不能作为新的投稿人提高投票率
public get currentTokenValue(): AuthResponse {
    return this.currentTokenSubject.getValue();
}