Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Ordem do router do animal

Fazendo o projeto eu tive um problema ao clicar na opção de novo animal. Quando eu implementei o componente do novo animal no router ficou da seguinte forma

import { NovoAnimalComponent } from './novo-animal/novo-animal.component';
import { ListaAnimaisResolver } from './lista-animais/lista-animais.resolver';
import { DetalheAnimalComponent } from './detalhe-animal/detalhe-animal.component';
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { ListaAnimaisComponent } from './lista-animais/lista-animais.component';

const routes: Routes = [
  {
    path: '',
    component: ListaAnimaisComponent,
    resolve: {
      animais: ListaAnimaisResolver,
    },
  },
  {
    path: ':animalId',
    component: DetalheAnimalComponent,
  },
  {
    path: 'novo',
    component: NovoAnimalComponent,
  },  
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule],
})
export class AnimaisRoutingModule {}

com o path novo após o path do detalhe animal. O problema é que dessa forma mesmo que eu clique no Link Novo Animal acaba sendo redirecionado para o componente do detalheAnimalComponente. Qual a razão pra isso acontecer ?

Após mudar a ordem o componente foi mostrado normalmente

const routes: Routes = [
  {
    path: '',
    component: ListaAnimaisComponent,
    resolve: {
      animais: ListaAnimaisResolver,
    },
  },
  {
    path: 'novo',
    component: NovoAnimalComponent,
  },
  {
    path: ':animalId',
    component: DetalheAnimalComponent,
  },
];
1 resposta
solução!

Olá, Iago! Tudo certo?

Uma rota de detalhe de animal possui o final animais/15, por exemplo, mas o Angular não sabe que 15 é exatamente o ID do usuário. O que a biblioteca sabe é que após animais/ haverá um trecho que deve ser entendido como animalId.

Assim, animais/15 e animais/novo possuem a mesma estrutura até onde o a biblioteca de rotas sabe.

Quando você mudou a ordem, primeiro é verificada se a rota acessada é animais/novo. Como novo não é um valor dinâmico, diferente de :animalId, a comparação é feita objetivamente ("animais/novo" === "animais/novo"), essa comparação retorna true e o fluxo segue como esperado.

Eu também tive esse problema aqui, e não sei dizer porque no caso do instrutor o funcionamento não foi afetado mesmo com a ordem daquela forma. Mas minha recomendação é usar como você está usando, com essa ordem, rotas dinâmicas são verificadas por último e evita esses erros.

Certo? Espero ter ajudado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software