Как вызвать Observer.next () при изменении свойства - PullRequest
0 голосов
/ 22 февраля 2019

Я делаю простое приложение для входа в систему.У меня есть компонент navbar, шаблон представления которого я хочу обновить в зависимости от того, вошел ли пользователь в систему или нет.В классе обслуживания UserService у меня есть метод выхода из системы.Мой компонент navbar выглядит следующим образом:

export class NavbarComponent implements OnInit {
  loginStatus: boolean;
  constructor(private _userService: UserService) { }

  ngOnInit() {
    this._userService.loginStatus().subscribe((data)=>{
      this.loginStatus = data;
      console.log('You are logged in:'+this.loginStatus)
    })
    setTimeout(()=>{
      this._userService.logout();
    }, 10000)// it's just an example for calling logout
  }

}

И UserService:

@Injectable()
export class UserService {
    private _token: string = null;

    set token(token) {
        localStorage.setItem('token', token);
        this._token = token;
        this.loggedIn = true;
    }
    get token() {
        if (this._token) {
            return this._token;
        }
        return this._token = localStorage.getItem('token');
    }
    private loggedIn: boolean = true;
    constructor(private _httpClient: HttpClient) { }

    logout(){
        console.log('out')
        this._token = null;
        this.loggedIn = false;
        localStorage.removeItem('token');
        localStorage.clear();
    }
    loginStatus(): Observable<boolean>{
        let observable: Observable<boolean> =  new Observable((observer) => {
            observer.next(this.loggedIn);
        })
        return observable;
    }
}

loginStatus () возвращает наблюдаемое, на которое я подписан в компоненте Navbar.Теперь проблема в том, что, когда я выхожу с помощью метода выхода из системы, я хочу, чтобы метод loginStatus () снова отправлял данные.Как я могу применить любое обнаружение изменений к свойству loggedIn, чтобы можно было наблюдать данные?Если вы знаете другой способ, вы можете предложить мне.Thankyou.

1 Ответ

0 голосов
/ 22 февраля 2019

Почему вы не используете тему?

public loginStatus: Subject<boolean> = new Subject<boolean>();

(вы также можете сделать ее приватной с помощью ее получателя ...).Вы подписываетесь на него как наблюдаемая, а затем выполняете:

loginStatus.next(this.loggedIn);

каждый раз, когда изменяется статус входа

...