首页 文章

Angular:类型'Observable<boolean>'没有兼容的呼叫签名

提问于
浏览
0

我还在学习角度,我想用一个布尔可观察的服务来创建一个服务,并订阅那个observable .

我跟着这个tutorial,因为我真正想要的是在用户未登录时隐藏菜单导航链接,本教程几乎相同 .

所以在我的登录服务中:

export class LoginService {

  private loggedIn = new BehaviorSubject<boolean>(false);

  get isLoggedIn() {
    console.log(this.loggedIn);
    return this.loggedIn.asObservable();
  }

  constructor(
    public http: Http,
    public utilsService: UtilsService) { }

  public login(credentials: Credentials): Observable<Response> {
    // login code
    // if user succeed login then:
    this.loggedIn.next(true);
  }

  public logout(): Observable<Response> {
    // logout code
    // if user succeed logout then:
    this.loggedIn.next(false);
  }
}

在我的组件中我使用此功能

public isLoggedIn: boolean;

userIsLoggedIn() {

  this._login.isLoggedIn().subscribe(
    ((res: boolean) => {
        console.log(res);
        this.isLoggedIn = res;
    })
  );

}  // <- this is (36,5) position returned from error log

如果一切正常,那么在组件模板的导航链接中使用简单的 *ngIf="isLoggedIn" 就可以了 . 但是有些东西是错的,我在尝试编译时会遇到下一个错误 .

/project-folder/src/app/shared/navbar/navbar.ts中的错误(36,5):无法调用其类型缺少调用签名的表达式 . 类型'Observable'没有兼容的呼叫签名 .

不知道出了什么问题 . 但作为一个新手,我需要说我不太清楚BehaviorSubject是什么,并且没有找到关于它的好的和易于理解的文档 .

它应该很容易,但经过几天尝试没有成功,我几乎放弃了隐藏未登录用户的链接 .

EDIT: 我添加了一部分package.json来显示使用的版本:

"devDependencies": {
  "@angular/cli": "1.4.5",
  "@angular/compiler-cli": "4.4.4",
  "@angular/language-service": "4.4.4",
  "@types/node": "6.0.60",
  "codelyzer": "3.2.0",
  // some of the dependencies omitted
  "gulp": "3.9.1",
  "gulp-coveralls": "0.1.4",
  "typescript": "2.3.3"
}

2 回答

  • 3

    您将isLoggedIn定义为具有此getter的属性:

    get isLoggedIn() {
        console.log(this.loggedIn);
        return this.loggedIn.asObservable();
      }
    

    但是你把它称为一个函数:

    this._login.isLoggedIn().subscribe(
        ((res: boolean) => {
            console.log(res);
            this.isLoggedIn = res;
        })
      );
    

    您需要将其作为属性访问:

    this._login.isLoggedIn.subscribe(  // No () here
        ((res: boolean) => {
            console.log(res);
            this.isLoggedIn = res;
        })
      );
    
  • 0

    loginService 中的函数 login(...)logout() 不能有类型 Observable<Response> ,因为你没有退回 Observable ,你只是执行一些函数所以类型应该是 void

相关问题