🧩 Exercícios: Roteamento Avançado, Lazy Loading e Router Guards
Spec Frontend Com Angular • Trilha Progressiva em 4 Níveis
🎯 Nível 1: Fundamentos
Problema 14.1 — Configuração de Rotas Standalone com loadComponent()
Contexto: Configuração de Rotas Standalone com loadComponent() no contexto de Roteamento Avançado, Lazy Loading e Router Guards.
Requisitos de Execução:
- Configurar carregamento lazy de componentes com
loadComponent: () => import('./dashboard.component').then(m => m.DashboardComponent).
Resultado Esperado
Rota carregada sob demanda em chunk JavaScript isolado.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_1_SeuNome - Envie na tarefa:
Atividade Cap 14 - Roteamento Avançado, Lazy Loading e Router Guards
🔑 Gabarito de Código & Solução Comentada
// app.routes.ts
import { Routes } from '@angular/router';
export const routes: Routes = [
{
path: 'dashboard',
loadComponent: () => import('./dashboard/dashboard.component').then(m => m.DashboardComponent)
}
];
🔍 Nível 2: Prática
Problema 14.2 — Guards Funcionais com CanActivateFn e Injeção com inject()
Contexto: Guards Funcionais com CanActivateFn e Injeção com inject() no contexto de Roteamento Avançado, Lazy Loading e Router Guards.
Requisitos de Execução:
- Criar guarda de rota funcional
authGuard: CanActivateFnverificando token noAuthService.
Resultado Esperado
Acesso à rota protegida bloqueado por CanActivateFn funcional.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_2_SeuNome - Envie na tarefa:
Atividade Cap 14 - Roteamento Avançado, Lazy Loading e Router Guards
🔑 Gabarito de Código & Solução Comentada
// auth.guard.ts
import { CanActivateFn, Router } from '@angular/router';
import { inject } from '@angular/core';
export const authGuard: CanActivateFn = (route, state) => {
const router = inject(Router);
const estaAutenticado = Boolean(localStorage.getItem('token'));
return estaAutenticado ? true : router.createUrlTree(['/login']);
};
⚡ Nível 3: Integração
Problema 14.3 — Carregamento de Dados com ResolveFn
Contexto: Carregamento de Dados com ResolveFn no contexto de Roteamento Avançado, Lazy Loading e Router Guards.
Requisitos de Execução:
- Pré-carregar dados da entidade antes da transição de rota com
produtoResolver: ResolveFn<Produto>.
Resultado Esperado
Dados resolvidos antes da renderização do componente de detalhes.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_3_SeuNome - Envie na tarefa:
Atividade Cap 14 - Roteamento Avançado, Lazy Loading e Router Guards
🔑 Gabarito de Código & Solução Comentada
// produto.resolver.ts
import { ResolveFn } from '@angular/router';
import { inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
export const produtoResolver: ResolveFn<any> = (route) => {
const http = inject(HttpClient);
const id = route.paramMap.get('id');
return http.get(`/api/produtos/${id}`);
};
🏆 Nível 4: Desafio Corporativo
Problema 14.4 — Guarda de Saída com CanDeactivateFn para Formulários com Dados Não Salvos
Contexto: Guarda de Saída com CanDeactivateFn para Formulários com Dados Não Salvos no contexto de Roteamento Avançado, Lazy Loading e Router Guards.
Requisitos de Execução:
- Alertar usuário caso tente sair da página com alterações não salvas no formulário.
Resultado Esperado
Transição de rota prevenida com caixa de diálogo de confirmação.
📤 Instruções de Entrega (Microsoft Teams)
- Salve o arquivo como:
Atividade_14_4_SeuNome - Envie na tarefa:
Atividade Cap 14 - Roteamento Avançado, Lazy Loading e Router Guards
🔑 Gabarito de Código & Solução Comentada
// unsaved-changes.guard.ts
import { CanDeactivateFn } from '@angular/router';
export interface PossuiAlteracoes { temAlteracoesNaoSalvas(): boolean; }
export const unsavedChangesGuard: CanDeactivateFn<PossuiAlteracoes> = (component) => {
return component.temAlteracoesNaoSalvas() ? confirm('Deseja descartar as alterações?') : true;
};