Angular-Loiane-Training

Este repositorio contem exemplos documentados e descricoes dos conteudos estudados ao longo do curso de Angular da Loiane

View project on GitHub

Guarda Rotas: Resolve - carregando dados antes da rota ser ativa

Em determinados casos torna-se necessario que dados sejam processados antes da renderizacao do component, como por exemplo para requisicoes que possuem tempos longos (requisicoes ajax, podem demorar alguns segundos), nestes casos e possivel utilizar o guarda rotas Resolve para que o componente seja renderizado apos o carregamento dos dados.

Similar a todos os guarda de rotas sua implementacao tambem parte da interface Resolve (note que esta interface recebe um tipo generico, que e o tipo de dado que sera carregado, neste caso estamos utilizado a classe AlunosModel que e a abstracao dos dados de alunos) e necessita a implementacao do metodo resolve, note que neste caso o construtor recebe a injecao de dependencia do um objeto do tipo AlunosService, pois este ira realizar a requisicao ao servidor (no caso do exemplo AlunosService e apenas uma classe com dados Mock), para carregar os dados antes do inicio da renderizacao do component.

OBS: Para este exemplo iremos implementar console.log nos metodos chamados para observar a ordem que o angular ira executar cada metodo

import { AlunosService } from './../rotas/alunos/alunos.service';
import { AlunoModel } from '../rotas/alunos/aluno.model';

import { Injectable } from '@angular/core';
import { Resolve, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable } from 'rxjs';

@Injectable({ providedIn: 'root' })
export class AlunoDetalheResolver implements Resolve<AlunoModel> {

  constructor(private service: AlunosService){ }

  resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): AlunoModel | Observable<AlunoModel> | Promise<AlunoModel> {

    console.log('Resolver') // metodo para observar no console

    const id = route.params['id']
    return this.service.getAluno(id)
  }
}

para recuperar os dados carregados previamente a renderizacao do component, iremos utilizar a injecao de dependencia ActivatedRoute (classe nativa do package @angular/router) e atraves da inscricao no atributo data obter os dados.

// ...demais imports omitidos
import { AlunoModel } from './../aluno.model';
import { ActivatedRoute, Router } from '@angular/router';

@Component({
  selector: 'app-aluno-detalhe',
  templateUrl: './aluno-detalhe.component.html',
  styleUrls: ['./aluno-detalhe.component.css']
})
export class AlunoDetalheComponent implements OnInit {

  // ...demais atributos omitidos
  public aluno: AlunoModel


  constructor(
    private _route: ActivatedRoute,
    private _router: Router,
  ) {
  }

  ngOnInit(): void {
    console.log('ngOnInit') // metodo para observar no console

    // obtendo dados pre-carregados pelo Resolver
    this._route.data.subscribe((x) => this.aluno = x.aluno)
  }

  // ...demais metodos omitidos
}

Note a ordem da saida no console


guarda rotas Resolve.