Buscar

Aula17 - Angular Routing

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

Aula17 - Angular Routing.pdf
 
Programação de Scripts – Prof. Arley 
Aula 17 – Angular Routing 
 
 1 
Objetivo: 
• Navegação entre componentes usando URL; 
• Definição de rotas; 
• Passar parâmetros entre os componentes; 
• Setar a marcação <title> da página. 
 
Descrição: O objetivo dessa aula é apresentar o uso do Angular Rounting para fazer a navegação entre componentes. A 
aplicação é formada por 4 componentes (componentes A, B, C e Page-not-found). A figura a seguir mostra o componente B. 
Para acessar os componentes A, B e C basta clicar nos itens da barra de menu ou nos links. Para ser endereçado para o 
componente Page-not-found basta fornecer uma URL desconhecida. 
 
 
Em anexo encontra-se os arquivos para reproduzir o exemplo, porém, antes siga os passos para criar o projeto da 
aplicação: 
1) Para reproduzir o exemplo crie um projeto Angular, usando o comando Angular CLI: 
ng new exemplo9 --minimal=true --style=css --routing=false 
O parâmetro --routing=true é usado para criar um módulo de roteamento. O objetivo dessa aula é mostrar o uso 
do Angular Routing (https://angular.io/guide/route), porém deixaremos para criar esse módulo no Passo 3. 
 
2) Utilize os comandos a seguir para criar os componentes, lembre-se que é necessário estar dentro da pasta do projeto 
exemplo9: 
ng generate component a 
ng generate component b 
ng generate component c 
ng generate component page-not-found 
 
3) Utilize o comando a seguir para criar o módulo de roteamento. Observe que se tivéssemos utilizado --routing=true 
na criação da aplicação (Passo 1), daí não precisaríamos criar o módulo de roteamento aqui. 
ng generate module rota --routing 
 
Programação de Scripts – Prof. Arley 
Aula 17 – Angular Routing 
 
 2 
O comando anterior cria os arquivos rota.module.ts e rota-routing.module.ts. O parâmetro --routing é 
opcional, ele é usado para criar o arquivo rota-routing.module.ts. É nesse arquivo que definimos um array com 
as rotas, assim como é mostrado a seguir: 
export const rotas: Routes = [ 
 {path: 'aaa/:nome/:idade', component: AComponent, data: {titulo:'Comp. A'}}, 
 {path: 'bbb', component: BComponent, data: {titulo:'Comp. B'}}, 
 {path: 'ccc', component: CComponent, data:{titulo: 'Comp. C'}}, 
 {path: 'ccc/:nome/:idade', component: CComponent, data:{titulo:'Comp. C'}}, 
 {path: '', redirectTo: '/ccc', pathMatch: 'full' }, 
 {path: '**', component: PageNotFoundComponent, data: { titulo: 'URL incorreta'} } 
]; 
Esse array pode estar nos arquivos rota-routing.module.ts ou app.module.ts. Neste exemplo, deixaremos 
ele no arquivo rota-routing.module.ts. 
 
4) Para formatar a parte visual usaremos classes do framework Bootstrap 4, então use o comando a seguir para instalar o 
Bootstrap 4 e suas dependências, assim como a biblioteca jQuery. Lembre-se que é necessário estar dentro da pasta do 
projeto exemplo9: 
npm install jquery 
npm install bootstrap 
Para fazer uso das classes Bootstrap na sua aplicação será necessário adicionar a seguinte instrução no arquivo 
exemplo9/styles.css: 
@import '~bootstrap/dist/css/bootstrap.min.css'; 
 
Copie os arquivos em anexo para o projeto da aplicação. A seguir tem-se a explicação de alguns pontos 
importantes. 
 
Definição das Rotas 
O Angular Router permite criar uma URL para uma view (componente), desta forma, é possível navegar de uma view para 
outra como se fossem páginas, mas na prática os componentes são ligados/endereçados usando a diretiva RouterLink e 
são renderizados dentro das marcações <router-outlet></router-outlet>. 
 <div class="container-fluid"> 
 <nav class="navbar navbar-expand navbar-light bg-light"> 
 <ul class="navbar-nav"> 
 <li class="nav-item pl-2 pr-2 border-right"> 
 <a routerLink="/aaa/Ana/21" routerLinkActive="ativo">A</a> 
 </li> 
 <li class="nav-item pl-2 pr-2 border-right"> 
 <a routerLink="/bbb" routerLinkActive="ativo">B</a> 
 </li> 
 <li class="nav-item pl-2 pr-2"> 
 <a routerLink="/ccc" routerLinkActive="ativo">C</a> 
 </li> 
 <li class="nav-item pl-2 pr-2"> 
 
Programação de Scripts – Prof. Arley 
Aula 17 – Angular Routing 
 
 3 
 <a routerLink="/teste" routerLinkActive="ativo">Page not found</a> 
 </li> 
 <li class="nav-item pl-2 pr-2"> 
 <a routerLink="/" >Default</a> 
 </li> 
 </ul> 
 </nav> 
 </div> 
 <div class="container-fluid"> 
 <!-- a diretiva RouterOutlet é usada para receber os componentes mapeados --> 
 <router-outlet></router-outlet> 
 </div> 
 
O atributo routerLinkActive é usado para indicar a classe CSS que irá receber o link em exibição. A classe ativo foi 
definida no arquivo exemplo9/styles.css. 
.ativo {color:red !important} 
 
Nas marcações HTML ficam as ligações, porém rotas (objeto do tipo Routes) precisam ser definidas no arquivo 
app.module.ts ou rota-routing.module.ts da seguinte forma: 
export const rotas: Routes = [ 
 {path: 'aaa/:nome/:idade', component: AComponent, data: {titulo:'Comp. A'}}, 
 {path: 'bbb', component: BComponent, data: {titulo:'Comp. B'}}, 
 {path: 'ccc', component: CComponent, data:{titulo: 'Comp. C'}}, 
 {path: 'ccc/:nome/:idade', component: CComponent, data:{titulo:'Comp. C'}}, 
 {path: '', redirectTo: '/ccc', pathMatch: 'full'}, 
 {path: '**', component: PageNotFoundComponent, data: { titulo: 'URL incorreta'}} 
]; 
Neste exemplo colocamos a definição no arquivo rota-routing.module.ts. Veja que as rotas são definidas num array 
JSON, com as seguintes propriedades: 
• path define a URL de acesso a view. No path podemos definir os parâmetros a serem passados para o componente 
na URL, no exemplo a seguir a URL é formada obrigatoriamente por 2 parâmetros 
path: 'aaa/:nome/:idade' 
Desta forma a view AComponent só poderá ser endereçada da seguinte forma: 
http://localhost:4200/aaa/Mariana/20 
Isto é, os exemplos a seguir serão direcionados para a página não encontrada (erro 404 not found): 
http://localhost:4200/aaa 
http://localhost:4200/aaa/Mariana 
• component define a view a ser mapeada pelo path; 
• data é um objeto JSON com propriedades que podemos passar para a view de destino: 
{path:'aaa/:nome/:idade', component: AComponent, data: {titulo:'Comp. A'}} 
A instrução a seguir se encontra no método ngOnInit da classe AComponent, nela estamos lendo a propriedade 
titulo: 
let titulo = this.route.snapshot.data['titulo']; 
 
Programação de Scripts – Prof. Arley 
Aula 17 – Angular Routing 
 
 4 
• redirectTo usada para redirecionar para outra URL caso o path seja satisfeito: 
{path:'', redirectTo:'/ccc', pathMatch:'full'} 
Nesse exemplo, a URL a seguir será redirecionada para http://localhost:4200/ccc: 
http://localhost:4200/ 
Já se utilizássemos o seguinte path: 
{path:'aaa/:nome', redirectTo:'/bbb',pathMatch: 'full'} 
A URL http://localhost:4200/aaa/Mariana seria redirecionada para http://localhost:4200/bbb 
A propriedade redirectTo requer o uso da propriedade pathMatch 
(https://angular.io/api/router/Route#pathMatch) para dizer se o critério de interpretação do path será full ou 
prefix. 
• path:'**' quando a URL não é satisfeita: 
{path:'**', component:PageNotFoundComponent, data:{titulo:'URL incorreta'}} 
Como exemplo, a URL http://localhost:4200/ddd será redirecionada
para a view 
PageNotFoundComponent. 
É muito importante a ordem das URLs (path) no array, pois se o 1º elemento do array for path:'**', então 
qualquer URL irá casar com **. 
 
Receber Parâmetros na Classe do Componente 
Os parâmetros são passados para a classe no construtor através do objeto do tipo ActivatedRoute: 
constructor( 
 private route:ActivatedRoute, 
 private router:Router, 
 private title:Title 
) { } 
Os parâmetros podem ser acessados através do objeto paramMap: 
this.route.snapshot.paramMap.get('nome') 
Para navegar de uma view para outra através da classe usa-se o método navigate do objeto Router: 
this.router.navigate(['/ccc/',this.nome, this.idade]); 
 
Para o array rotas ser reconhecido em toda a aplicação é necessário importar ele no decorator @NgModule da classe 
AppModule usando RouterModule.forRoot(rotas). 
 
 
src/app/app.component.ts
import { Component } from '@angular/core';
@Component({
 selector: 'app-root',
 template: `
 <div class="container-fluid">
 <nav class="navbar navbar-expand navbar-light bg-light">
 <ul class="navbar-nav">
 <li class="nav-item pl-2 pr-2 border-right">
 <a routerLink="/aaa/Ana/21" routerLinkActive="ativo">A</a>
 </li>
 <li class="nav-item pl-2 pr-2 border-right">
 <a routerLink="/bbb" routerLinkActive="ativo">B</a>
 </li>
 <li class="nav-item pl-2 pr-2">
 <a routerLink="/ccc" routerLinkActive="ativo">C</a>
 </li>
 <li class="nav-item pl-2 pr-2">
 <a routerLink="/teste" routerLinkActive="ativo">Page not found</a>
 </li> 
 <li class="nav-item pl-2 pr-2">
 <a routerLink="/" >Default</a>
 </li> 
 </ul>
 </nav>
 </div>
 <div class="container-fluid">
 <!-- A diretiva RouterOutlet é usada para receber os componentes mapeados -->
 <router-outlet></router-outlet>
 </div>
 `,
 styles: []
})
export class AppComponent {
 title = 'exemplo9';
}
src/app/app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { RouterModule } from '@angular/router';
import { AppComponent } from './app.component';
import { AComponent } from './a/a.component';
import { BComponent } from './b/b.component';
import { CComponent } from './c/c.component';
import { PageNotFoundComponent } from './page-not-found/page-not-found.component';
import { rotas } from './rota/rota-routing.module';
@NgModule({
 declarations: [
 AppComponent,
 AComponent,
 BComponent,
 CComponent,
 PageNotFoundComponent
 ],
 imports: [
 BrowserModule,
 FormsModule,
 /* é necessário registrar as rotas usando RouterModule.forRoot()
 Ao usar forRoot o serviço Router estará disponível em toda a aplicação */
 RouterModule.forRoot(rotas) 
 ],
 providers: [],
 bootstrap: [AppComponent]
})
export class AppModule { }
src/app/a/a.component.css
src/app/a/a.component.html
Componente A
Nome: {{nome}}
Idade: {{idade}}
 Ir para C
src/app/a/a.component.ts
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { Title } from '@angular/platform-browser';
@Component({
 selector: 'app-a',
 templateUrl: './a.component.html',
 styleUrls: ['./a.component.css']
})
export class AComponent implements OnInit {
 nome: string;
 idade: number;
 /* o construtor precisa recebe os seguintes objetos */
 constructor(
 private route:ActivatedRoute, 
 private router:Router, 
 private title:Title) { }
 ngOnInit() {
 /* ler o conteúdo da propriedade data */
 let titulo = this.route.snapshot.data['titulo'];
 this.title.setTitle(titulo); /* setar o <title> da janela */
 /* receber os parâmetros da URL */
 this.nome = this.route.snapshot.paramMap.get('nome');
 this.idade = +this.route.snapshot.paramMap.get('idade');
 }
 goto():void{
 this.router.navigate(['/ccc/',this.nome, this.idade]);
 }
}
src/app/b/b.component.css
src/app/b/b.component.html
 Nome: 
 Idade: 
 Link para a view A:
 ./aaa/{{nome}}/{{idade}} 
 Link para a view C:
 ./ccc/{{nome}}/{{idade}} 
src/app/b/b.component.ts
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Title } from '@angular/platform-browser';
@Component({
 selector: 'app-b',
 templateUrl: './b.component.html',
 styleUrls: ['./b.component.css']
})
export class BComponent implements OnInit {
 nome: string;
 idade: number;
 constructor(
 private route: ActivatedRoute, 
 private title:Title) { }
 ngOnInit() {
 let titulo = this.route.snapshot.data['titulo'];
 this.title.setTitle(titulo);
 }
}
src/app/c/c.component.css
src/app/c/c.component.html
Componente C
Nome: {{nome}}
Idade: {{idade}}
 Voltar
src/app/c/c.component.ts
import { Component, OnInit } from '@angular/core';
import { Title } from '@angular/platform-browser';
import { Location } from '@angular/common';
import { ActivatedRoute } from '@angular/router';
@Component({
 selector: 'app-c',
 templateUrl: './c.component.html',
 styleUrls: ['./c.component.css']
})
export class CComponent implements OnInit {
 nome:string;
 idade:number;
 constructor(
 private route: ActivatedRoute, 
 private title:Title, 
 private location: Location) { }
 ngOnInit() {
 let titulo = this.route.snapshot.data['titulo'];
 this.title.setTitle(titulo);
 this.route.params.subscribe( parametros => (
 this.nome = (parametros['nome'] != undefined? parametros['nome'] : ''),
 this.idade = (parametros['idade'] != undefined? +parametros['idade'] : undefined)
 )
 );
 }
 paginaAnterior():void{
 this.location.back();
 }
}
src/app/page-not-found/page-not-found.component.css
src/app/page-not-found/page-not-found.component.html
 page-not-found
src/app/page-not-found/page-not-found.component.ts
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Title } from '@angular/platform-browser';
@Component({
 selector: 'app-page-not-found',
 templateUrl: './page-not-found.component.html',
 styleUrls: ['./page-not-found.component.css']
})
export class PageNotFoundComponent implements OnInit {
 constructor(
 private route:ActivatedRoute,
 private title:Title) { }
 ngOnInit() {
 /* ler o conteúdo da propriedade data */
 let titulo = this.route.snapshot.data['titulo'];
 this.title.setTitle(titulo); /* setar o <title> da janela */
 }
}
src/app/rota/rota-routing.module.ts
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import { AComponent } from '../a/a.component';
import { BComponent } from '../b/b.component';
import { CComponent } from '../c/c.component';
import { PageNotFoundComponent } from '../page-not-found/page-not-found.component';
export const rotas: Routes = [
 {path: 'aaa/:nome/:idade', component: AComponent, data: { titulo: 'Comp. A'}},
 {path: 'bbb', component: BComponent, data: { titulo: 'Comp. B'}},
 /* se não fizer essa especificação, daí será mapeado para PageNotFoundComponent */
 {path: 'ccc', component: CComponent, data: { titulo: 'Comp. C'}},
 {path: 'ccc/:nome/:idade', component: CComponent, data: { titulo: 'Comp. C'}},
 /* quando a URL termina na porta http://localhost:4200/ ela será direcionada para */
 {path: '', redirectTo: '/ccc', pathMatch: 'full' },
 /* quando a URL não existir será direcionado para esse componente, por exemplo,
 * ao
clicar no Link inexistente - http://localhost:4200/teste */
 {path: '**', component: PageNotFoundComponent, data: { titulo: 'URL incorreta'} }
];
@NgModule({
 imports: [RouterModule.forChild(rotas)],
 exports: [RouterModule]
})
export class RotaRoutingModule { }
src/app/rota/rota.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RotaRoutingModule } from './rota-routing.module';
@NgModule({
 declarations: [],
 imports: [
 CommonModule,
 RotaRoutingModule
 ]
})
export class RotaModule { }
src/styles.css
/* You can add global styles to this file, and also import other style files */
@import '~bootstrap/dist/css/bootstrap.min.css';
.ativo {color:red !important}

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Continue navegando