angular - 如何在属性更改时触发observer.next()
问题描述
我正在制作一个简单的登录注销应用程序。我有一个导航栏组件,我想根据用户是否登录来更新其视图模板。在 UserService 服务类中,我有注销的方法。我的导航栏组件如下所示:
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
}
}
和用户服务:
@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 组件中订阅的 observable。现在的问题是当我使用 logout 方法注销时,我希望 loginStatus() 方法再次发出数据。如何将任何更改检测应用于loggedIn 属性,以便可观察到的发出数据。如果你知道任何其他方式,你可以建议我。谢谢你。
解决方案
为什么不使用主题?
public loginStatus: Subject<boolean> = new Subject<boolean>();
(您也可以使用它的吸气剂将其设为私有......)。你像 observable 一样订阅它,然后执行:
loginStatus.next(this.loggedIn);
每次登录状态改变
推荐阅读
- node.js - 如何安全地为 Web 应用程序创建管理员用户?
- python - 如何将 sh -c "$(curl -fsSL URL)" 转换为原生 python
- php - 类型提示所以属性是特定对象类型的数组
- mysql - 如何在 MySql 中使用 group by 查询非聚合列?
- reactjs - react-autosuggest 与 debounce 和 distinctUntilChanged
- python - 如何从安装在 CPanel 上的烧瓶应用程序生成错误日志?
- python - 带参数的 Ctypes 回调函数
- arrays - 获取 Swift 中具有最低值的数组中的字典对象
- java - 我可以只使用 Spring security 的 CSRF 功能而不使用它的 LOGIN 和 LOGOUT 功能吗?
- python - 如何使对话框后面的窗口不可点击?