如何创建一个可观察的?

时间:2018-05-21 20:22:03

标签: rxjs angular5

我想我理解ObservablesRxjs的概念,但我正在努力将理论转化为代码。

我有一个Angular组件,比如C。我希望它应该显示某些HTML组件,具体取决于用户是否登录。为此,我使用类似于

的代码
<ng-container *ngIf = "userNotloggedIn"> 
...

我有一个Angular Service来验证用户身份。我希望一旦用户通过身份验证,该服务就应emit一个值(例如boolean truefalse对应于登录和注销)。我想为此使用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)
    } )

}

然后在组件中,我订阅了observable,如下所示:

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,但没有注册signin和signout函数中创建的新Observable。我怎样才能解决我的问题?

1 个答案:

答案 0 :(得分:0)

Observable.of(true)返回一个cold observable,它不会随着时间的推移发出新的值。

使用userSignedIn $的行为主题

userSignedIn$=new BehabviorSubject();

如果您想更新登录状态,请使用

userSignedIn$.next(true)
相关问题