Защитник CanActivate может вернуть Observable<boolean | UrlTree>
начиная с версии 7.1.0 Angular. Это позволяет охраннику оценить boolean
и вернуть перенаправление маршрута, если оно оценивается как ложное.
Я написал ответ несколько дней назад, в котором рассматриваются детали реализации, но вот как я бы подошел к нему в вашем случае:
Сначала создайте стражу:
import { Injectable } from '@angular/core';
import { CanActivate, Router, UrlTree, ActivatedRouteSnapshot } from '@angular/router';
import { Observable, of } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
// import your TaskService here
@Injectable()
export class RequireDocumentsGuard implements CanActivate {
constructor(private router: Router, private taskService: TaskService) {
}
canActivate(route: ActivatedRouteSnapshot): Observable<boolean | UrlTree> {
return this.taskService.DocumentsTask(route.params.taskId).pipe(
catchError(() => of(false)),
map(documents => !!documents || this.router.parseUrl('error/404'))
);
}
}
Затем просто добавьте охрану к вашему маршруту в вашем RoutingModule
:
{
path: 'your/desired/route/:taskId',
component: YourComponentHere,
canActivate: [RequireDocumentsGuard ]
}
Примечание:
Вы не опубликовали свою структуру маршрута, поэтому я также отмечу, что вам необходимо убедиться, что ваш маршрут «error / 404» на самом деле существует как:
{
path: 'error/404',
component: Your404ErrorComponent
}
Надеюсь, это поможет!