#angular #foreach #rxjs #observable
#угловой #инструкция foreach #rxjs #наблюдаемый
Вопрос:
Я вызывал эту функцию из своего routing.module.ts. Эта функция проверяет, есть ли у пользователя утверждение, возвращает значение true, иначе перенаправит его на страницу ошибки.
const routes: Routes = [ { path: NavigationURL_EmployeeAuditChildren.PayItems, component: PayItemsComponent, canActivate: [EmployeeGuard], data: { claim: claims.employeePayItemAccess} } }
Ибо здесь это называется
canActivate(route: ActivatedRouteSnapshot): Observablelt;booleangt; { const claim: string = route.data[RouteData.Claim]; return this.securityService.hasClaim(claim).pipe( map((hasClaim) =gt; { if (hasClaim) { return true; } else { this.router.navigate(['/forbidden']); return false; } }) ); }
Мне нужно изменить эту функцию, чтобы проверить наличие нескольких утверждений. Если у пользователя есть какое-либо из этих утверждений, оно должно вернуть значение true, иначе вернет страницу с ошибкой. Я подумываю об использовании claims.map() для перебора каждого утверждения. Но, как вернуться изнутри, если будет найдено какое-либо утверждение, иначе верните страницу с ошибкой?
const routes: Routes = [ { path: NavigationURL_EmployeeAuditChildren.PayItems, component: PayItemsComponent, canActivate: [EmployeeGuard], data: { darwinClaim: [claims.employeePayItemAccess, claims.employeePayItemAuditAccess] } }
Это Вызывает:
canActivate(route: ActivatedRouteSnapshot): Observablelt;booleangt; { const claims: string[] = route.data[RouteData.Claim]; claims.foreach(claim -gt; { this.securityService.hasClaim(claim).pipe( map((hasClaim) =gt; { if (hasClaim) { return true; } }) )}); this.router.navigate(['/forbidden']); return false; }
Комментарии:
1. я использую метод SecurityService.HasClaim (), чтобы проверить, есть ли у меня претензия. Я делаю внутри него другие вещи, поэтому не могу его удалить. Он возвращает наблюдаемое. Теперь я должен запустить вызов этого метода внутри цикла, но, поскольку он заметен, это сильно усложняет задачу.
Ответ №1:
Попробуйте это:
const hasClaimsResult = forkJoin(claims.map(claim =gt; this.securityService.hasClaim(claim))); return hasClaimsResult.pipe( map(claims =gt; { if (claims.every(claim =gt; claim)) { return true; } else { this.router.navigate(['/forbidden']); return false; } }) );
Использование карты в массиве утверждений приведет к созданию an Arraylt;Observablelt;booleangt;gt;
, поэтому я использую forkJoin
ее для преобразования в an Observablelt;Arraylt;booleangt;gt;
. Затем мы можем передать полученное наблюдаемое по каналу, как мы привыкли, и проверить, что каждое значение истинно.