如何让指令在数据加载时再次运行

时间:2018-02-18 15:47:59

标签: angular angular5

我有一个指令,应检查用户是否有声明,然后根据此显示相应的菜单元素。

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/

1 个答案:

答案 0 :(得分:1)

为了让其他单位收到auth状态变化的通知,auth service shoud会公开一个可以订阅的观察点:

private isAuth = new BehaviorSubject<boolean>(false);
public isAuth$ = this.isAuth.asObservable();

它可以使用this.isAuth.next(...)发出状态更改。由于isAuthBehaviorSubject,因此当前值也可用this.isAuth.value

其他单位可以通过以下方式订阅更改:

authorizationService.isAuth$.subscribe(isAuth => { ... });