Angular: тип «Observable <boolean>» не имеет совместимых подписей вызовов - PullRequest
0 голосов
/ 08 декабря 2018

Я все еще учусь на английском, и я хочу сделать сервис с булевой наблюдаемой и подписаться на эту наблюдаемую.

Я следовал этому учебнику , потому что я действительно хочу этоскрыть ссылки навигации по меню, когда пользователь не вошел в систему, и этот учебник почти такой же.

Итак, в моем сервисе входа в систему:

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): невозможновызвать выражение, тип которого не имеет подписи вызова.Тип «Наблюдаемый» не имеет совместимых подписей вызовов.

Не знаю, что случилось.Но как новичку я должен сказать, что я не очень хорошо знаю, что такое BehaviorSubject, и не нашел хорошую и легкую для понимания документацию по нему.

Это должно быть легко, но после несколькихдни, пытаясь безуспешно, я близок к тому, чтобы скрывать ссылки для не авторизованных пользователей.

РЕДАКТИРОВАТЬ: Я добавляю часть 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 ]

0 голосов
/ 08 декабря 2018

Вы определяете isLoggedIn как свойство с этим геттером:

  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 голосов
/ 08 декабря 2018

функции login(...) и logout() в loginService не могут иметь типы Observable<Response>, потому что вы не получаете Observable, вы просто выполняете некоторые функции, поэтому тип должен быть void

...