Как создать наблюдаемую? - PullRequest
0 голосов
/ 21 мая 2018

Мне кажется, я понимаю концепцию Observables в Rxjs, но я изо всех сил пытаюсь преобразовать теорию в код.

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

<ng-container *ngIf = "userNotloggedIn"> 
...

У меня есть Angular Service, который аутентифицирует пользователя.Я хочу, чтобы, как только пользователь прошел аутентификацию, сервис должен emit значение (скажем, boolean true или false, соответствующее входу и выходу из системы).Я хотел бы использовать Observable для этого, и мой компонент должен подписаться на это Observable.

Я изо всех сил пытаюсь преобразовать это в код.В моем сервисе я создал Observable следующим образом, и затем я выдаю значения (true или false), когда пользователь входит или выходит из системы:

export class UserManagementService {
  userSignedIn$: Observable<boolean>;

  constructor(private http: HttpClient, private bs:WebToBackendInterfaceService) {
    this.userSignedIn$ = Rx.Observable.of(false)

  }

  onUserSignout(){
    console.log("In UserManagementService: onUserSignout")
    return this.bs.onUserSignout().subscribe((res/*:ServerResponse*/)=>{
      console.log("response fromm server",res)
      this.userSignedIn$ = Rx.Observable.of(false)
    }); //res is of type HttpResponse
  }

 signinUser(user:UserSigninInfo){
return this.bs.signinUser(user).subscribe((res:HttpResponse<any>)=>{console.log('response from server:',res);
      console.log('response headers',res.headers.keys())
      this.userSignedIn$ = Rx.Observable.of(true)
    } )

}

Затем вкомпонент, я подписываюсь на наблюдаемый следующим образом:

ngOnInit(){

    this.userloggedIn = false;
    this.userManagementService.userSignedIn$.subscribe(x=>{console.log("got stream value ",x);
      this.userloggedIn = x})
...

  }

Приведенный выше код не работает, хотя.Я получаю самое первое значение, испускаемое Observable (соответствующее this.userManagementService.userSignedIn$.subscribe(x=>{console.log("got stream value ",x);), но ничего после этого.

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

1 Ответ

0 голосов
/ 22 мая 2018

Observable.of (true) возвращает холодную наблюдаемую, которая не может генерировать новые значения с течением времени.

вместо этого используйте тему поведения для userSignedIn $ *

userSignedIn$=new BehabviorSubject();

и когда вы хотите обновить статус входа, используйте

userSignedIn$.next(true)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...