Angular / NgRx - объединить 2 селектора в гвардии - PullRequest
1 голос
/ 16 апреля 2019

У меня есть canActivate, где я получаю 2 состояния

canActivate(): Observable<boolean> {

this.store.dispatch(new fromProjectActions.SelectProjectAction(43))

  combineLatest(
    this.store.pipe(
      select(fromProjectSelectors.getSelectedProject)
      ),
    this.store.pipe(select(fromUserSelectors.getUser))
    ).pipe(
      map(([project, user]) => {
        // Logic here
        // return true if project.creatorId === user.id
      })
    );
}

Как я могу сделать это, зная, что getUser уже доступно в состоянии, но getSelectedProject необходимо отправить егодействие до

РЕДАКТИРОВАТЬ:

canActivate(): Observable<boolean> {
    this.store.dispatch(new fromProjectActions.SelectProjectAction(43));

    combineLatest(
      this.store.pipe(
        select(fromProjectSelectors.getSelectedProject)
        ),
      this.store.pipe(select(fromUserSelectors.getUser))
      ).subscribe(([project, user]) => {
        // here the first time `project` is `null`, have to wait the 
          second time
        if (project) {
          if (project.id === user.id) {
            return of(true);
          } else {
            return of(false);
          }
        }
      });
}

1 Ответ

1 голос
/ 16 апреля 2019

Если ваша проблема в том, что select(fromProjectSelectors.getSelectedProject) испускает null, вы можете просто отфильтровать его:

combineLatest(
  this.store.pipe(
    select(fromProjectSelectors.getSelectedProject).pipe(
      filter(project => !!project))
    ),
  this.store.pipe(select(fromUserSelectors.getUser))
  ).subscribe( ...
...