-2

设置很简单。我有一个守卫路线的守卫。如果是用户的属性locationSaved === true那么我们要让用户进入页面。

如果浏览器令牌的第一次检查是假的,我们想发出一个 HTTP 请求来查看用户对象的 locationSaved 属性的最新版本是否可能更新为真。

我做了服务器请求,它返回真,所以我希望它打开页面,但不幸的是它没有。我认为这与我在页面中所做的异步请求有关,因为当我将服务器请求代码替换为简单的return true; 然后它确实打开了页面。

如果服务器返回true,有谁知道我如何使用这个异步请求并导航到页面?

这是我的守卫代码。我进行了设置,以便它发出异步请求并且服务器返回 true。但是,它不会导航到该页面。

import { Injectable } from '@angular/core';
import {ActivatedRouteSnapshot, CanActivate} from '@angular/router';
import {AuthenticationService} from './auth.service';
import {Observable} from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class LocationGuardService implements CanActivate {

  constructor(private authService: AuthenticationService) { }

  canActivate(route: ActivatedRouteSnapshot): boolean {
    console.log('entered the guard');
    if (this.authService.isLoggedIn()) {
      if (this.authService.currentUser().user.locationSaved) {
        return true;
      } else {
        this.authService.isLocationSaved()
          .subscribe((status: {saved: boolean}) => {
            console.log('saved', status);
            return status.saved;
          });
      }
    } else {
      return false;
    }
  }
}
4

1 回答 1

1

不会,因为在 else 块中,您没有返回任何内容。而不是subscribeing,你应该mapped 到status.saved

当然,该canActivate方法现在将返回 aboolean或 an Observable<boolean>。因此,您可能想要更改canActivate.

这应该有效:

import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate } from '@angular/router';
import { AuthenticationService } from './auth.service';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable({
  providedIn: 'root'
})
export class LocationGuardService implements CanActivate {

  constructor(private authService: AuthenticationService) { }

  canActivate(route: ActivatedRouteSnapshot): boolean | Observable<boolean> {
    if (this.authService.isLoggedIn()) {
      if (this.authService.currentUser().user.locationSaved) {
        return true;
      } else {
        return this.authService.isLocationSaved()
          .pipe(map(status => status.saved));
      }
    } else {
      return false;
    }
  }
}
于 2018-10-15T17:35:05.073 回答