订阅一个在不同组件中调用的观察者时遇到问题 .
我的Angular 4应用程序有一个导航栏,其中包含一些用户信息 . 在登录时从对服务器的http请求获得用户信息 . 这是使用LoginService管理的 . 在注销时,我们将用户设置为null .
logIn() {
return this.http
.get(this.apiUrl)
.map(response => response.json())
}
logOut() {
return Observable.of(null)
}
从登录组件中,使用该服务很容易获得用户详细信息 .
logIn() {
this.loginService.logIn().subscribe((user) => {
console.log('Logged in')
this.user = user
console.log(this.user)
)
}
但我还需要从另一个组件中获取它们以设置导航栏中的值 . 我想我需要使用navbar组件订阅LoginService logIn()和logOut()函数,合并这些observable,如果它们中的任何一个触发事件,则更新用户 . 但我不能订阅它们,2天后我仍然坚持这个 .
I've made a plunk to show the problem . 单击登录按钮时,应设置app.component中的用户,并且在单击注销按钮时应取消设置 .
2 回答
我只是使用
BehaviorSubject
而不是将用户保留为LoginService
中的属性 . 然后,您可以在需要当前用户时随时订阅它 . 然后注销只是调用.next(null)
:看到你更新的plnkr:https://plnkr.co/edit/soeqH4IiNhcanNqxdnLS?p=preview
login服务
模板:
一个更简单的解决方案是不暴露可观察对象,而只是暴露数据 . 我在这里更新了你的plunker:https://plnkr.co/edit/ilfEtmxolC16vRKRiE0q?p=preview
服务:
组件:
html: