我有一个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时再次重定向到配置文件!但这不是一个好主意...我有相同的受保护路由...当我刷新页面时每个受保护的页面,重定向到个人资料页面!
答案 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
值,另一方面,后期订阅者(作为路由操作的一部分)仍然会看到最后一个值。