【问题标题】:how to trigger observer.next() on property change如何在属性更改时触发observer.next()
【发布时间】:2019-07-16 07:00:58
【问题描述】:

我正在制作一个简单的登录-注销应用程序。我有一个导航栏组件,我想根据用户是否登录来更新其视图模板。在 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 属性,以便可观察到的发出数据。如果你知道任何其他方式,你可以建议我。谢谢。

【问题讨论】:

    标签: angular typescript rxjs observable


    【解决方案1】:

    为什么不使用主题?

    public loginStatus: Subject<boolean> = new Subject<boolean>();
    

    (您也可以使用它的 getter 将其设为私有...)。你像 observable 一样订阅它,然后执行:

    loginStatus.next(this.loggedIn);
    

    每次登录状态改变

    【讨论】:

    • 感谢您的宝贵回答,但我想知道是否有任何其他方法可以跟踪财产的价值变化并对这种变化做出反应。
    • 嗯,你的意思是Subjects的主要用法。这就是为什么我建议你使用它。你可能仍然根本不认识他们。看看:medium.com/@luukgruijs/understanding-rxjs-subjects-339428a1815b
    • 为什么不在你的属性 set() 方法中调用主题的 next() 方法?
    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 2015-10-20
    • 2016-12-14
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多