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

Definindo e Extraindo Parametros de Roteamento

para obter uma rota que espera receber parametros, o primeiro passo e declarar a rota no arquivo app.routing.ts, neste exemplo iremos declarar a rota cursos/:id, note que o nome do parametro e prececido por : para identificar que se trata de um parametro.

{ path: 'curso/:id', component: CursoDetalheComponent }

um novo component foi criado para este exemplo. Apenas para exemplificar como obter um valor ou passar o valor para a rota, na pagina incial app.component.html, iremos inserir uma nova opcao na barra de navegacao e um campo input para inserir algum valor que posteriormente sera o argumento para a rota.

<nav>
    <div class="nav-wrapper">
        <a routerLink="" class="brand-logo right">Rotas Ng2</a>
        <ul id="nav-mobile" class="left hide-on-med-and-down">
          <li routerLinkActive="active"><a routerLink="/login">Login</a></li>
          <li routerLinkActive="active"><a routerLink="/cursos">Cursos</a></li>

          <!-- nova rota inserida -->
          <li routerLinkActive="active"><a [routerLink]="['curso', id_curso.value]">Cursos com Id</a></li>
        </ul>
    </div>
</nav>
<div class="container">
    <p>Entre com o id do curso</p>

    <!-- campo para receber o id -->
    <input #id_curso>
    <router-outlet></router-outlet>
</div>

note que foi declarada uma variavel local #id_curso que sera utilizada para passar o valor digitado no campo input para a diretiva routerLink, neste caso e possivel fazer property Binding passando um array onde o primeiro elemento e a rota e os demais sao os argumentos para os parametros.

Para este exemplo foi criado o CursoDetalheCompoenet, o pacote @angular/router possui um classe ActivatedRoute que possui diversos metodos para trabalhar com rotas (injetada no component por injecao de dependencias do angular, via construtor), utilizamos o console.log() para verificar a estrutura do objeto, e podemos verificar que o objeto route possui o atributo snapshot que e um registro instantaneo da rota, logo por meio dele podemos pegar o valor do id (parametro declarado na rota no arquivo app.routing.ts).

import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';

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

  id: string = "";

  constructor(private route: ActivatedRoute) {
    // console.log(this.route);
    this.id = this.route.snapshot.params['id'];
   }

  ngOnInit(): void {
  }

}

no HTML do CursoDetalheComponent temos apenas uma interpolacao para exibir o valor retornado da rota.

<p>
    id: 
</p>

Exemplo


Problema

O captura dos dados pelo atributo snapshot da classe ActivatedRoute ocorre posteriormente a renderizacao do component, ou seja, no caso deste exemplo ao alterar o valor do campo input e mudar de rota o valor atribuito ao parametro id permanece o mesmo pois sera necessario renderizar novamente o component com o valor antigo do atributo, e ao fim da renderizacao o novo valor e atribuido, e para que o novo valor seja visivel, deve-se renderizar novamente.