Route Guard: Как я могу установить true или false на основе параметров, установленных из HttpPost?

Мой код:

@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,
    );
}

1 ответ

Вы хотите вернуть логическое значение, но логическое значение может быть получено только асинхронно. Так что вы не можете вернуть логическое значение. К счастью, как вы можете видеть в типе возврата метода, вы можете вернуть Observable<boolean>, Observable (или обещание) точно используется для этого: вернуть асинхронный результат.

Так что не подписывайтесь на наблюдаемую 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));
Другие вопросы по тегам