我有一个指令,应检查用户是否有声明,然后根据此显示相应的菜单元素。
case 'UPDATE_ELEMENT': {
const elements = state.elements.map(el => {
if (el.id === id) {
const style = { ...el.style, [property]: value };
return { ...el, style };
} else {
return el;
}
});
return { ...state, elements };
}
这在重装时效果很好。但是,如果我签出它不会运行。什么是最好的方法来重新检查登录/退出?
编辑:基于评论和一些阅读:
在授权服务中,我创建了一个BehaviorSubject
export class ClaimsDirective {
constructor(
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef,
private authorizationService: AuthorizationService
) { }
@Input() set claims(allowedClaims: Array<string>) {
let shouldShow: boolean = false;
for (let allowedClaim of allowedClaims) {
if (this.authorizationService.hasClaim(allowedClaim))
shouldShow = true;
}
if (shouldShow) {
this.viewContainer.createEmbeddedView(this.templateRef);
} else {
this.viewContainer.clear();
}
}
}
然后在构造函数中,我检查您是否已登录:
private isAuth: BehaviorSubject<boolean>;
public getIsAuth(): Observable<boolean> {
return this.isAuth.asObservable();
}
然后登录/退出:
const currentUser = JSON.parse(localStorage.getItem(this.currentUserKey));
if (currentUser)
this.isAuth = new BehaviorSubject<boolean>(true);
else
this.isAuth = new BehaviorSubject<boolean>(false);
最后在我订阅的指令中:
this.isAuth.next(true);
这是Angular 5 / RxJS的正确模式吗?
(这是基于答案:https://www.reddit.com/r/Angular2/comments/76inse/noob_observable_on_change_of_value/)
答案 0 :(得分:1)
为了让其他单位收到auth状态变化的通知,auth service shoud会公开一个可以订阅的观察点:
private isAuth = new BehaviorSubject<boolean>(false);
public isAuth$ = this.isAuth.asObservable();
它可以使用this.isAuth.next(...)
发出状态更改。由于isAuth
为BehaviorSubject
,因此当前值也可用this.isAuth.value
。
其他单位可以通过以下方式订阅更改:
authorizationService.isAuth$.subscribe(isAuth => { ... });