0

我的代码:

@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
    }
}

评论是我喜欢做的,但我真的不知道我应该写什么,因为这是我第一次使用 angular 4。

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

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

服务:

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

1 回答 1

0

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

所以,不要订阅由securityActions(). 相反,使用map()andcatchError()运算符将 observable 转换为 Observable:

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));
于 2018-08-13T10:09:43.300 回答