Использование Angular 6 Guards canLoad с модулями LazyLoaded и Ngrx 6 с Rxjs 6 guard не удается завершить - PullRequest
0 голосов
/ 01 ноября 2018

Вот мой охранник

import { Injectable} from '@angular/core';
import {
  CanActivate,
  ActivatedRouteSnapshot,
  RouterStateSnapshot,
  CanLoad,
  Route
} from '@angular/router';
import { Observable, of } from 'rxjs';
import { switchMap, map, filter, take, tap, catchError } from 'rxjs/operators';

import { Store} from '@ngrx/store';

import * as fromStore from '../store';

@Injectable({
  providedIn: 'root'
})
export class AuthenticationGuard implements CanLoad {
  constructor(
    private store: Store<fromStore.State>
  ) {}

  canLoad(route: Route): boolean | Observable<boolean> | Promise<boolean> {
    return this.store.select(this.store.getUser).pipe(
      tap(user => {
        if (!user.loaded) {
          console.log('loading user');
          this.store.dispatch(new fromStore.LoadUser());
        }
      }),
      filter(user => user.loaded),
      map(user => {
        console.log('User loaded get rights', user);
        return this.hasRights(user, route);
      }),
      catchError(error => {
        console.log(error);
        return of(false);
      }),
      take(1)
    );
  }

  hasRights(user, route: Route): boolean {
    if (!user.loaded) {
      return false;
    } else {
      console.log('returning true');
      return true;
    }
  }

}

Когда эта защита работает, она действует так, как будто селектор не завершен, но я получаю журналы «загрузка пользователя», затем я получаю журнал «Пользователь загружен, получая права», затем я получаю журнал «возвращая истину» , Я также включил в качестве последнего шага дубль (1), но все же он действует так, будто наблюдаемое не завершает то, что я пропускаю?

...