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));