我的UserService和配置文件组件中的SubjectBehavior

时间:2016-06-15 12:36:32

标签: javascript angularjs authentication angular rxjs

我有一个ShareService:

 isLogin$:BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false); <==== default value is false
    CheckUser = this.isLogin$.asObservable();
    public isLogin (bool){
        this.isLogin$.next(bool);
}

这是我的个人资料组件:

 _shareService.CheckUser.subscribe(val =>{

            this.isLogin = val;
            if(!val)
                _router.navigate(['AccessDenied']);

 });

这是我的authService:

  public authorize() {
        this._util.get('api/profile/my').then(value => {

                UserService._data = value.result;
                this._shareService.isLogin(true);

        }).catch(reason => {
  this._shareService.isLogin(false);
        });

    }

当我的应用程序运行时,我执行我的authorize()功能... 那我的问题是什么?! 当我在配置文件路由上刷新页面时,我的问题是我使用BehaviorSubject默认值,直到我的authorize()函数获取检查我的BehaviorSubject在配置文件组件中发送错误值并重定向到{{ 1}}页面! 我尝试AccessDenied,但没有工作! 我该怎么办? 我可以在Subject()组件中订阅CheckUser,当值为true时再次重定向到配置文件!但这不是一个好主意...我有相同的受保护路由...当我刷新页面时每个受保护的页面,重定向到个人资料页面!

1 个答案:

答案 0 :(得分:0)

如果您正在使用BehaviorSubject向新订阅者提供上一个值,则可能需要考虑使用ReplaySubject

isLogin$:Subject<boolean> = new ReplaySubject<boolean>(1); <==== default value is false
    CheckUser = this.isLogin$.asObservable();
    public isLogin (bool){
        this.isLogin$.next(bool);
}

如果我理解你的描述,这应该有效。一方面,你不会在那里等待false值,另一方面,后期订阅者(作为路由操作的一部分)仍然会看到最后一个值。