我想我理解Observables
中Rxjs
的概念,但我正在努力将理论转化为代码。
我有一个Angular组件,比如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)
} )
}
然后在组件中,我订阅了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。我怎样才能解决我的问题?
答案 0 :(得分:0)
Observable.of(true)返回一个cold observable,它不会随着时间的推移发出新的值。
使用userSignedIn $的行为主题
userSignedIn$=new BehabviorSubject();
如果您想更新登录状态,请使用
userSignedIn$.next(true)