Route Guard:如何根据HttpPost设置的参数设置true或false?

时间:2018-08-13 08:52:44

标签: angular typescript canactivate angular-route-guards

  

我的代码:

@Injectable()

export class UserRouteAccessService implements CanActivate {

    authorized = [
        'AGREEMENTS_VIEW',
        'PROSPECTS_VIEW',
        'AGREEMENTS_INSERT_UPDATE',
        'PRODUCTS_INSERT_UPDATE',
        'PROSPECTS_INSERT_UPDATE',
        'DOCUMENTS_VIEW',
        'DOCUMENTS_INSERT_UPDATE',
    ];

    constructor(private router: Router, private securityService: CralSecurityService) {
    }



    canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
        //boolean var


        this.securityService.securityActions().subscribe(
            data => {
                //control if auth. is correct

                //if yes set true
                //if not set false
            },
            error => {
                //return an error
            }
        )
        //return boolean
    }
}

评论是id想要做的,但是我真的不知道该写些什么,因为这是我第一次使用angular 4。

基本上,如果要发送来自授权的某些参数,则我想将其设置为True,如果服务中没有参数,则要设置为false。

我希望这很清楚,如果您需要更多信息,请告诉我:)

  

服务:

securityActions(): Observable<any> {
    return this.http.post<Observable<any>>(
        `${this.ENDPOINT}/security-actions`,
        null,
    );
}

1 个答案:

答案 0 :(得分:0)

您想返回一个布尔值,但是该布尔值只能异步获取。因此,您不能返回布尔值。幸运的是,如您在方法的返回类型中所见,您可以返回Observable<boolean>。一个Observable(或一个Promise)正是用来做到这一点的:返回异步结果。

因此,请勿订阅securityActions()返回的可观察值。而是使用map()catchError()运算符将可观察对象转换为可观察对象:

return this.securityService.securityActions().pipe(
    map(data => {
            //control if auth. is correct

            //if yes set true
            //if not set false
    },
    catchError(() => of(false))
);

注意:如果您仍在使用Angular和RxJS的旧版本,则应该升级。如果确实还不能,则需要将上面的代码调整为使用的旧版本RxJS:

// TODO import the required operators, as documented in your old version of RxJS

return this.securityService.securityActions().map(
    data => {
            //control if auth. is correct

            //if yes set true
            //if not set false
    }
).catch(() => of(false));