Ошибка Angular CanActivate при обновлении браузера, даже если наблюдаемое возвращает true - PullRequest
0 голосов
/ 14 ноября 2018

У нас есть защита маршрутизации для CanActivate, которая отлично работает при переходе между ссылками на сайте, но не работает, когда мы полностью обновляем браузер (т. Е. Он перенаправляет на домашнюю страницу, такое же поведение, как если бы CanActivate возвращает false).

Это моя охрана

@Injectable()
export class PermissionCheckGuard implements CanActivate {
    constructor(private userPermissionService: UserPermissionService) { }

    canActivate(
        route: ActivatedRouteSnapshot,
        state: RouterStateSnapshot
    ): Observable<boolean> | Promise<boolean> | boolean {
        let permissionTag = route.data["permissionTag"] as string;

        let hasPermission$ = this.userPermissionService.hasPermission(null, SubjectType.Site, permissionTag, null);

        hasPermission$.subscribe(x => {
            console.log(x);
        });

        return hasPermission$;
    }
}

Это моя конфигурация маршрутизатора: -

path: 'security/security-example', component: SecurityExampleComponent, canActivate: [PermissionCheckGuard], data: { permissionTag: 'Site_Permission_1' }

В случае, если это имеет значение, это функция hasPermission

 public hasPermission(userId: string, subjectType: SubjectType, permissionTag: string, subjectId: string): Observable<boolean> {

        if (userId == null) {
            userId = 'Current';
        }

        const url = this.apiUrlBuilder.create('Security', 'Users', userId, 'Permission', {
            permissionTag: permissionTag,
            subjectType: subjectType,
            subjectId: subjectId
        });

        return this.http.get(url)
            .map<Response, boolean>((response: Response) => {
                return <boolean>response.json();
            })
            .catch((error) => {
                return this.errorHandlingService.ToNotification(error, this);
            })
    }

Я не вижу, что я делаю неправильно, охранник возвращает наблюдаемое, а журнал консоли всегда возвращает true.Это проблема с angular или в моем коде ошибка?

1 Ответ

0 голосов
/ 14 ноября 2018

Полагаю, это как-то решено, прежде чем вы получите ответ. Попробуйте использовать subject здесь.

import { Subject } from 'rxjs';

canActivate(
    route: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
): Observable<boolean> | Promise<boolean> | boolean {
    let permissionTag = route.data["permissionTag"] as string;

    let hasPermission$ = this.userPermissionService.hasPermission(null, SubjectType.Site, permissionTag, null);

 const subject: Subject<boolean> = new Subject();
    hasPermission$.subscribe(x => {
        console.log(x);
        subject.next(x);
    });

    return subject.asObservable();
}
...