Como manejar rutas en angular
Cuando se trabaja con Angular uno de los features mas importantes son las rutas estas son muy facil de implementar.
¿Qué necesitamos?
-
NPM, por lo tanto se necesita Nodejs
-
Editor de tu preferencia, pero con soporte para TypeScript
-
Un proyecto vacío, si no sabes cómo lee el post Creando un proyecto con angular 4
Que vamos a hacer
La estructura que nos arroja CLI es la siguiente o al menos la más importante
1
2
3
4
5
├── src
│ └── app
│ ├── app.component.html
│ ├── app.component.ts
│ ├── app.module.ts
Lo que vamos hacer es mostrar una tabla de usuarios, y agregaremos un detalle de cada usuario.
Los componentes
Se agregan dos componentes uno de usuarios y otro de detalle asi que la estructura de archivos queda de la siguiente forma
1
2
3
4
5
6
7
8
9
10
├── app
│ ├── app.component.html
│ ├── app.component.ts
│ ├── app.module.ts
│ ├── detail
│ │ ├── detail.component.html
│ │ └── detail.component.ts
│ └── users
│ ├── users.component.html
│ └── users.component.ts
El componente de usuarios
En el archivo /app/users/users.component.ts agregamos una colección de datos de usuarios este lo puedes obtener del sitio JSONPlaceholder
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
users: any=[
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "Sincere@april.biz",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"zipcode": "92998-3874",
"geo": {
"lat": "-37.3159",
"lng": "81.1496"
}
},
"phone": "1-770-736-8031 x56442",
"website": "hildegard.org",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
}, ...
]
}
En el archivo /users/users.component.html y mostramos una tabla con los usuarios
1
2
3
4
5
6
7
8
9
10
11
<h2>Users</h2>
<table>
<tr>
<th>Id</th>
<th>Name</th>
</tr>
<tr *ngFor="let user of users">
<td><a routerLink="/detail/{ { user.id } }"> { { user.id } } </a></td>
<td>{ { user.name } }</td>
</tr>
</table>
Lo importante de aquí es la siguiente línea <a routerLink="/detail/"> { { user.id } } </a>
la propiedad routerLink se le pasa la ruta a la que vamos a llamar /detail
y el parámetro id del usuario { { user.id } }
El componente detalle
El archivo /app/detail/detail.component.ts vamos a recibir el parámetro id que nos ayudara a buscar dentro de nuestra colección de datos para mostrarlos dentro de la vista detalle
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { Component } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
selector: 'app-detail',
templateUrl: './detail.component.html'
})
export class DetailComponent {
users: any=[...]
id= null;
user = null;
constructor(private route: ActivatedRoute ){
this.id= this.route.snapshot.params['id'];
this.user=(this.searchUser());
}
searchUser(){
return this.users.filter( (user)=>{ return user.id == this.id})[0] || null;
}
}
Esta línea this.id= this.route.snapshot.params['id'];
nos ayuda a obtener el parámetro id
Con el método searchUser()
mediante un arrow funtion extraemos la información del usuario
El archivo /app/detail/detail.component.html solo mostramos la información del usuario
1
2
3
4
5
6
7
8
9
10
11
12
<h2>Detail</h2>
<table>
<tr>
<td>Name</td><td></td>
</tr>
<tr>
<td>Email</td><td></td>
</tr>
<tr>
<td>Phone</td><td></td>
</tr>
</table>
Modificando el componente principal
Recordemos que por default había creado un componente, entonces hay que modificarlo para que active las rutas.
El archivo /app/app.component.html queda de la siguiente forma y lo mas importante es el tag router-outlet
1
2
3
4
<div>
<h1>Routes</h1>
<router-outlet></router-outlet>
</div>
Configurando la ruta
Dentro del archivo app/app.module.ts realizamos lo siguiente
- Agregamos la definición de las rutas en una variable appRoutes
1 2 3 4 5
const appRoutes: Routes =[ {path:'',component:UsersComponent}, {path:'users',component:UsersComponent}, {path:'detail/:id',component:DetailComponent} ]
- agregamos la definicion en el @ngModule
1 2 3 4 5 6 7 8 9
@NgModule({ declarations: [ UsersComponent, DetailComponent ], imports: [ RouterModule.forRoot(appRoutes) ] })
El archivo app/app.module.ts queda de la siguiente forma
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { Routes,RouterModule } from "@angular/router";
import {UsersComponent} from './users/users.component';
import {DetailComponent} from './detail/detail.component';
const appRoutes: Routes =[
{path:'',component:UsersComponent},
{path:'users',component:UsersComponent},
{path:'detail/:id',component:DetailComponent}
]
@NgModule({
declarations: [
AppComponent,
UsersComponent,
DetailComponent,
],
imports: [
BrowserModule,
RouterModule.forRoot(appRoutes)
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Y el resultado
¿Donde está el codigo?
Quieres ver como funciona antes de escribir codigo, porque no, aqui te dejo el repo en git