Angular Недействительность охранника - PullRequest
0 голосов
/ 09 мая 2020

Я бы хотел, чтобы мой auth guard разрешал / ограничивал доступ на основе наблюдаемого, которое периодически запускает логическое значение. Моя идея была:

auth$ = interval(5000).pipe(map((n) => n % 2 === 0));

canActivate(
    next: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
): Observable<boolean> | Promise<boolean> | boolean {
    return this.auth$;
}

Это работает, когда триггеры идут от false до true, но не наоборот, похоже, что тогда охрана больше не активна.

1 Ответ

0 голосов
/ 09 мая 2020

Охрана срабатывает один раз при каждом запуске навигации.

Как только angular получает первое излучение от охранника, он отменяет подписку и использует полученное значение, чтобы разрешить / запретить маршрутизацию.

Это означает, что вы не можете периодически генерировать значения в guard, чтобы изменить исходное значение.

То, что вы пытаетесь достичь, может быть реализовано следующим образом:

import {Injectable, OnDestroy} from '@angular/core';
import {CanActivate} from '@angular/router';
import {interval, Observable, Subject} from 'rxjs';
import {map, takeUntil, tap} from 'rxjs/operators';

@Injectable({
    providedIn: 'root',
})
export class AuthGuard implements CanActivate, OnDestroy {
    protected readonly auth$: Subject<boolean> = new Subject();
    protected readonly destroy$: Subject<void> = new Subject();

    constructor(
    ) {
        interval(5000).pipe(
            map(n => n % 2 === 0),
            tap(value => this.auth$.next(value)),
            takeUntil(this.destroy$),
        ).subscribe();
    }

    public canActivate(): Observable<boolean> {
        return this.auth$;
    }

    // not sure if this part works for guards
    // but would be nice to unsubscribe once you don't need this guard
    // anymore
    public ngOnDestroy(): void {
        this.destroy$.next();
        this.destroy$.complete();
    }
}
...