HTTP调用中的RxJs BehaviorSubject

时间:2016-06-06 14:12:15

标签: angular rxjs

我是Angular 2的新手。过去我能够用文档解决所有出现的问题。但目前我对Angular 2使用的可观察模式存在很多问题,它带有rxjs。

我有以下工作流程。我实现了一个用户服务,它负责注册,登录,注销等基本步骤。此外,我还有一个标题组件,它将显示用户菜单。根据用户的登录信息,我想更新菜单(例如show logout或show login entries)。

为了实现这一点,我使用了rxjs-lib中的BehaviorSubject。基本上我只需要一个简单的布尔值,名为loggedIn,每次用户登录或注销时都会更新。这是服务,组件和模板的片段。

export class UsersService {

  private _loggedIn: BehaviorSubject<boolean> = new BehaviorSubject(false);

  public loggedIn: Observable<boolean> = this._loggedIn.asObservable();

    constructor(private _router: Router, public http: Http, @Inject('ApiUrl') private apiUrl: string) {
        let token = localStorage.getItem('token');
            if (token) {
                this._loggedIn.next(!this.jwtHelper.isTokenExpired(token));
            }
    }


   public login(body): void {
    this.http.post(this.apiUrl + '/login', body, { headers: contentHeaders })
      .subscribe(
      response => {
        localStorage.setItem('token', response.json().token);
        this._loggedIn.next(!this.jwtHelper.isTokenExpired(response.json().token));
        this._router.navigateByUrl('');
      },
      error => {}
      );
  }

  public logout(): void {
    localStorage.removeItem('token');
    this._loggedIn.next(false);
    this._router.navigateByUrl('/login');
  }
}


export class HeaderComponent {

  loggedIn: boolean = false;
  private _subscription: any;

  constructor(private _users: UsersService) {

    this._subscription = this._users.loggedIn.subscribe((value) => {
      this.loggedIn = value;  
    });

}

当应用程序被引导时以及用户注销时,标题组件中的值会更新。问题是登录方法中的POST调用。似乎next()永远不会被调用。但回调中的其他内容如this._router.navigateByUrl(&#39;&#39;);虽然被称为。

我不确定我在这里做错了什么?我是否必须在回调中创建一个新的observable,或者登录本身是否会返回一个observable?

任何提示都表示赞赏! THX!

修改

stackoverflow很有趣。在我发表这个问题之后,我立即得到了其他问题的建议。但在我搜索之前,我找不到答案。问题是我多次注入服务,而不是仅仅在引导期间注入服务。

在此处找到解决方案:Issue with RxJs BehaviorSubject's subscriber not being notified of value change

尽管如此,这是一个合理的模式来通知更新组件吗?

0 个答案:

没有答案