如何将全局变量订阅到BehaviorSubject?

时间:2018-06-30 14:33:04

标签: angular angular5

我正在构建一个登录功能,我希望app.component模板中的某些按钮在用户登录后立即显示。我正在尝试为此使用BehaviorSubject。我为模板中的按钮使用了*ngIf,条件是一个名为loggedIn的变量。但是,当我尝试使用SubjectBehavior订阅的结果初始化loggingIn变量时,出现错误:

ERROR in app.component.ts(10,3): error TS2322: Type 'Observable<boolean>' is not assignable to type 'boolean'. 

我不知道是什么原因造成的,因为我返回的是布尔值,而不是可观察值。这是app.component的代码:

export class AppComponent {
  private loggedIn: boolean = this.loginService.isLoggedIn().pipe(
    map((isLoggedIn: boolean) => {         // {3}
      if (!isLoggedIn){
        return false;
      }
      return true;
    }));

  constructor(private loginService: LoginService){}

  logout():void{
    this.loginService.logout();
  }

}

,这里是loginService的相关代码:

   isLoggedIn():BehaviorSubject<boolean>{
    return this.loggedIn; 
  }

  login(username: string, password: string): Observable<boolean> {
    return this.http.post(this.authUrl, JSON.stringify({username: username, password: password}), {headers: this.headers}).map((response: Response) => {
            // login successful if there's a jwt token in the response
            let token: any = response.json().token;
            if (token) {
                // store username and jwt token in local storage to keep user logged in between page refreshes
                localStorage.setItem('currentUser', JSON.stringify({ username: username, token: token }));
                this.loggedIn.next(true);
                // return true to indicate successful login
                return true;
            } else {
                // return false to indicate failed login
                return false;
            }
        }).catch((error:any) => Observable.throw(error.json().error || 'Server error'));
}

2 个答案:

答案 0 :(得分:1)

由于您使用的是行为主题,因此不必调用agian函数,可以按如下所示直接使用主题,

 login() {
    this.loginService.login(this.user.name,this.user.password).subscribe(
      (response) => {
        this.loginService.loggedIn.next(true);
        this.router.navigate(['/home']);
      }, (error) => {
        this.loginService.loggedIn.next(false);
        if (error.status == 400) {
          this.showErrorAlert();
        } else {
          console.log(error);
        }
      });
  }

答案 1 :(得分:1)

正确的答案是我应该使用subscribe方法而不是像这样的管道:

  constructor(private loginService: LoginService){
    this.loginService.isLoggedIn().subscribe((isLoggedIn: boolean) =>
    {
      if (!isLoggedIn){
        this.loggedIn = false;
      }
      this.loggedIn = true;
    })