Resolvers
April 16, 2022 · View on GitHub
Los resolvers son servicios pensados para ser proveedores de datos.
ng g resolver user
@Injectable({ providedIn: 'root' })
export class UserResolver implements Resolve<any> {
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<any>|Promise<any>|any {
// TODO: Implement code
}
}
Esta clase debe implementar el interfaz Resolve
interface Resolve<T> {
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<T> | Promise<T> | T
}
El propósito de un resolver es conseguir información ANTES de que la ruta sea activada.
El router llamará al método resolve() y esperará a que los datos hayan sido resueltos/provistos antes de proceder a activar la ruta.
const routes: Routes = [
// ...
{ path: 'form-template/:userId', component: FormTemplateComponent, resolve: {user: UserResolver, otherData: AnotherResolver} },
// ...
@Injectable({ providedIn: 'root' })
export class UserResolver implements Resolve<User> {
+ constructor(private service: UserService) {}
resolve(
route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
): Observable<User> | Promise<User> | User {
+ return this.service.getOne(route.paramMap.get('userId'));
}
}
Ahora nuestro componente puede coger los datos directamente del ActivatedRoute.
constructor(private route: ActivatedRoute){
+ this.user = this.route.snapshot.data['user'];
- const id = this.route.snapshot.paramMap.get('userId');
- this.userService.getOne(+id!).subscribe(
- user => this.user = user
- );
}
Si un resolver devuelve null, el router cancelará la navegación.
Si se produce un error, el router también cancelará la navegación.
Si una ruta tiene resolvers y tiene guards, primero se ejecutan los guards.