Escolar Documentos
Profissional Documentos
Cultura Documentos
1. Pipes................................................................................................................................................. 5
Pipe para utilizar iframes............................................................................................................ 5
Utiles...........................................................................................................................................5
Imgenes.................................................................................................................................5
UpperCase y LowerCase................................................................................................................. 6
Slice................................................................................................................................................. 6
Manipulando arreglos con Slice..................................................................................................6
Utilizando Pipes en *ngFor.........................................................................................................6
Pipe Decimal (Number)...................................................................................................................7
Limitar la cantidad de decimales a mostrar.................................................................................7
Pipe Percent - Porcentaje................................................................................................................. 7
Otros formatos.............................................................................................................................8
Pipe Currency Moneda................................................................................................................. 8
El currency code:........................................................................................................................ 8
Mostrar simbolo de la moneda....................................................................................................8
Obteniendo la parte entera de una moneda.................................................................................9
Pipe JSON........................................................................................................................................9
Pipe Async....................................................................................................................................... 9
Pipe Date Fecha.......................................................................................................................... 10
Formatos disponibles:............................................................................................................... 10
Cambiar fechas a espaol..........................................................................................................10
Pipes personalizados Capitalizar palabras.................................................................................. 11
Argumentos en Pipes.................................................................................................................12
Utilizando el operador REST para obtener los argumentos de un Pipe....................................12
Funcin de capitalizacin..........................................................................................................13
Capitalizando solo si se desea capitalizar................................................................................. 13
Pipe Personalizado DomSeguro..................................................................................................13
2. SpotiApp.........................................................................................................................................15
Crear componentes y servicios usando Angular CLI.....................................................................15
Componentes:............................................................................................................................15
Servicios....................................................................................................................................15
Estructura de un componente....................................................................................................15
Importar el componente creado al app.component.ts................................................................15
Qu podemos hacer dentro de las clases?............................................................................... 15
Declarar variables segn su tipo:..........................................................................................15
Directivas estructurales: *ngIf y *ngFor...................................................................................16
*ngIf..................................................................................................................................... 16
*ngFor.................................................................................................................................. 16
Eventos......................................................................................................................................16
angular-cli.json..........................................................................................................................16
tsconfig.json (Vaco)................................................................................................................. 16
Rutas.............................................................................................................................................. 17
Consideraciones........................................................................................................................ 17
Rutas con Parmetros................................................................................................................18
Recibir parmetros que vengan por la URL: (Video 14 segunda seccin)............................... 18
Servicios.........................................................................................................................................20
Hacer consultas al servidor usando el mdulo HTTP...............................................................20
Autenticacin con Token en Spotify......................................................................................... 21
Subscribindonos a nuestro observable.................................................................................... 21
Recibiendo la data del artista en una sola lnea.........................................................................22
Emitiendo y escuchando gracias al ngModel............................................................................22
Cmo resolver errores que pueden ocurrir al pedir un dato asincrono.....................................22
Insertar audio usando Angular.................................................................................................. 22
3. Componentes, directivas de atributos, ciclo de vida y ms............................................................23
ngStyle:..........................................................................................................................................23
ngClass:..........................................................................................................................................23
Modificar valores de objetos.....................................................................................................24
Usando procesos asincronos con indicadores de usuario..........................................................24
Directivas personalizadas.............................................................................................................. 25
Enviando parmetros a la directiva appResaltado creada.........................................................25
ngSwitch Multiples opciones con una sola decisin:................................................................. 26
Rutas y Rutas Hijas........................................................................................................................26
Crear componente dentro de otro ya creado anteriormente......................................................26
Creamos el enrutado principal.................................................................................................. 27
Capturar parmetros en una ruta o subruta............................................................................... 27
Creando rutas para navegacin interna..................................................................................... 28
Definir una ruta hija por defecto...............................................................................................28
Creando un archivo app.routes.ts exclusivo para la ruta del usuario........................................29
Obteniendo el parmetro del padre desde las rutas hijas.......................................................... 30
Ciclo de vida completo de un componente....................................................................................31
ngOnInit:...................................................................................................................................31
ngOnChanges:...........................................................................................................................31
ngDoCheck:.............................................................................................................................. 31
ngAfterContentInit:...................................................................................................................31
ngAfterContentChecked:.......................................................................................................... 31
ngAfterViewInit:....................................................................................................................... 31
ngAfterViewChecked:...............................................................................................................31
ngOnDestroy:............................................................................................................................31
Ejemplo de uso:.........................................................................................................................32
Ver video de ejemplo en Udemy para ver el ciclo completo (131):.....................................32
4. Formularios.....................................................................................................................................33
Variables locales........................................................................................................................33
Grupo de objetos.......................................................................................................................33
Clases que automticamente se asignan a determinados elementos de formulario..................33
Usar nombre de campo para verificar su validez......................................................................34
Clases CSS para validacin.......................................................................................................34
ng-untouched........................................................................................................................34
ng-pristine.............................................................................................................................34
ng-valid.................................................................................................................................34
ng-dirty................................................................................................................................. 34
Quitar validaciones por defecto de HTML5............................................................................. 34
Como postear los datos?..........................................................................................................35
Como obtener la data?...............................................................................................................35
Comprobar la validez de un formulario?.................................................................................. 35
Como configuramos un elemento de formulario?...................................................................35
Caja de bananas.........................................................................................................................35
Setear datos por defecto en una sola direccin......................................................................... 36
Combobox (select)....................................................................................................................37
Poner el valor por default (selected).....................................................................................37
Radio:........................................................................................................................................37
Refactorizando el cdigo para el radio button......................................................................38
Checkboxes...............................................................................................................................38
Aproximacion por Data................................................................................................................. 39
Importar FormGroup, FormControl y Validators......................................................................39
Importar en el app.module el mdulo ReactiveFormsModule................................................. 39
Sintaxis de FormGroup:............................................................................................................39
Relacionar esta informacin con el HTML...............................................................................40
Crear funcin guardarCambios con su contenido................................................................ 40
Enlazar campos de formulario a las propiedades de nuestro objeto forma que es de tipo
FormGroup................................................................................................................................40
Aplicando reglas de validacin.................................................................................................40
Mostrar validaciones HTML................................................................................................41
Otras formas:........................................................................................................................ 41
Usar Clase CSS en las validaciones.....................................................................................41
Aplicar estilos a validaciones anidadas................................................................................41
Cmo anidar objetos para validacin:.......................................................................................42
Cargar Data al formulario.............................................................................................................. 43
Primera forma........................................................................................................................... 43
Segunda forma.......................................................................................................................... 44
Como resetear el formulario con la forma "pristine".....................................................................44
Aadir arreglo de opciones que el usuario pueda ingresar............................................................44
El componente FormArray........................................................................................................45
En la vista..................................................................................................................................45
Aadimos la funcin agregar pasatiempos............................................................................... 46
Modificar la plantilla para iterar sobre el arreglo de pasatiempos............................................46
Validaciones personalizadas.......................................................................................................... 47
Prevenir que un campo tenga un valor determinado.................................................................47
Validar contraseas....................................................................................................................47
Creamos la funcin NoIgual.................................................................................................48
Otra forma de aadir noIgual a password2............................................................................... 48
Modificacin de la funcin noIgual..........................................................................................48
Data: Validadores asncronos.................................................................................................... 49
Creamos un validador...........................................................................................................49
Creamos el elemento a validar............................................................................................. 49
Creamos el procedimiento asincrono................................................................................... 49
Detectar cambios en los valores o estado del formulario o un control..................................... 50
Suscribindonos a escuchar todos los cambios....................................................................50
Suscribindonos a escuchar solo un campo a la vez............................................................ 50
Suscribindonos cuando el status ha cambiado....................................................................50
5. Autenticacin con Auth0................................................................................................................ 51
Comenzando con Auth0 Componentes y Servicios....................................................................52
Instalar Auth0............................................................................................................................52
Crear el Authentication Service................................................................................................ 52
Crear el arcihvo AuthService............................................................................................... 52
Importar el servicio en el navbar.component.ts........................................................................ 53
Refactorizando el Navbar.............................................................................................................. 53
Configuraciones en Auth0 dashboard y uso del servicio...............................................................54
Refactorizar navbar.component.html........................................................................................ 55
Refactorizar el navbar.component.ts.........................................................................................55
Servicio de bloqueo CanActivate AuthGuard........................................................................56
Como protegemos una ruta?........................................................................................................ 57
Obteniendo el perfil de usuario que inici sesin..........................................................................57
Aadimos el profile al componente protegido..........................................................................58
Personalizando el Login y otras opciones......................................................................................59
6. Uso del HTTP - CRUD Firebase................................................................................................60
Iniciando el proyecto..................................................................................................................... 60
Creacin de los componentes........................................................................................................ 62
Modificacin del app.component.html..................................................................................... 62
Creamos las rutas...................................................................................................................... 62
Trabajando con el HTML..........................................................................................................63
Modificamos los botones de los *.component.html..................................................................64
Creando el servicio que realizar las peticiones....................................................................... 64
Modificacin del HTML del hroe:.......................................................................................... 65
Modificando nuestro heroes.service.ts......................................................................................66
Actualizacin de un registro en Firebase (PUT)............................................................................68
Coger valores que vienen por la URL.......................................................................................68
Modificamos el mtodo guardar().............................................................................................69
Obtener un nodo especfico (GET)................................................................................................69
Modificado heroe.component.ts................................................................................................70
Modificamos el heroe.component.html.....................................................................................70
Dejando el formulario en su estado Pristine............................................................................. 70
Obtener listado de todos los hroes (GET)....................................................................................71
Creamos el mtodo getHeroes() en el servicio......................................................................... 71
Modificamos el heroes.component.ts........................................................................................71
Creamos un Pipe....................................................................................................................... 72
Modificamos el heroes.component.html...................................................................................72
Eliminar registros (HTTP DELETE)..........................................................................................73
Creamos la funcin borrarHeroe()............................................................................................ 73
Creamos la funcin borrarHeroe en el servicio.........................................................................73
Creamos el botn Eliminar en el heroes.component.html........................................................ 73
Refactorizamos el componente heroes.component.ts............................................................... 74
Actualizar el Pipe para que est pendiente del ciclo de cambios que haga Angular.................74
Maquillando nuestra aplicacin.....................................................................................................74
1. Pipes
Nos permiten cambiar la presentacin de la informacin que manejamos con Angular.
[elemento a transformar] | [elemento transformador]
Debemos crear una carpeta llamada pipes en app/pipes/. Ah debemos colocar todos nuestros pipes.
Usamos el Angular CLI para generar el Pipe: ng g p pipes/sinfoto. Angular CLI automticamente
aadir las referencias en el app.module.ts
Sintaxis:
Ej.
{{ nombre | uppercase }}
{{ fecha | date: 'y' }} <- solo muestra el ao.
Ej.
Utiles
Imgenes
[src]="heroe.img" <- interpreta el contenido como un objeto heroe con propiedad img.
[alt]="heroe.descripcion" <- igual que el anterior.
UpperCase y LowerCase
Los usamos para convertir una cadena a maysculas y minsculas respectivamente.
Slice
Permite cortar textos de un texto o arreglos. Eliminaremos las primeras tres posiciones de un texto
Pipe
Decimal (Number)
Nos permite formatear nmeros.
Limitar la cantidad de decimales a mostrar
Otro ejemplo
Otros formatos
Pipe Currency Moneda
Es nicamente para mostra nmeros con formato de moneda.
number_expression | currency[:currencyCode[:symbolDisplay[:digitInfo]]]
El currency code:
Es una representacin por cada pas. Todas estas representaciones las podemos encontrar en:
https://en.wikipedia.org/wiki/ISO_4217
Para el Per el currency code es PEN.
Pipe Async
Es usado para poder mostrar informacin que viene de observables o promesas.
Formatos disponibles:
Todos los formatos podemos encontrarlos en esta URL:
https://angular.io/docs/ts/latest/api/common/index/DatePipe-pipe.html
Ejemplo:
Cambiar fechas a espaol
Vamos al app.module.ts y hacemos una importacin
import { LOCALE_ID } from @angular/core
Aadimos un objeto al arreglo de providers:
El resultado es el siguiente:
Argumentos en Pipes
Utilizando el operador REST para obtener los argumentos de un Pipe
Funcin de capitalizacin
Ocurre el siguiente
error que
menciona que hay un recurso inseguro:
Para verificar que eso sea seguro debemos crear un Pipe llamado domseguro:
Bypaseando el recurso:
Modificamos el HTML:
2. SpotiApp
Servicios
ng c s servicios/nombre_servicio
Estructura de un componente
Un componente est compuesto por:
Imports
@Component
mostrar:boolean = true;
texto:string = "Yo quiero que escuches la imagen de mi alma";
autor:string = "Criollos";
personajes:string[] = ["spiderman", "Venom", "Dr. Octopus"];
Directivas estructurales: *ngIf y *ngFor
*ngIf
Es usado para mostrar u ocultar algn elemento HTML. Esta etiqueta elimina o muestra en el DOM
un elemento HTML, no lo oculta simplemente, hace que el elemento en mencin desaparezca del
rbol del DOM. Ej.
<div *ngIf="mostrar"></div>
*ngFor
Es usado para repetir elementos HTML. Ej.
{{ i + 1 }}- {{ personaje }}
</li>
Eventos
Los clsicos eventos javascript se ejecutan con la siguiente sintaxis:
(evento)=variable | o funcin
Ej.
angular-cli.json
Contiene toda la referencia a las libreras y cosas importantes que ocupar nuestra aplicacin.
Usaremos npm para instalar las libreras y en los arreglos styles y scripts referenciamos a esas
libreras que estn dentro de node_modules. Hay que tener cuidado con las dependencias entre
ficheros javascript, como por ejemplo en el caso de Bootstrap, necesita jquery para funcionar. Debe
colocarse primero.
Nota Importante: Si queremos ver los cambios cuando aadamos referencias de archivos css y
javascript en el angular-cli.json es necesario parar el servidor y volver a iniciarlo con ng serve.
tsconfig.json (Vaco)
En este archivo podemos aadir configuraciones para que Atom funcione ms rapido, entre otras
cosas ms. Si deseamos que Atom funcione ms rpido debemos escribir lo siguiente:
},
"exclude": [
"../node_modules"
],
compileOnSave: false
Con esta confitguracin le estamos diciendo al Angular CLI que no tome en cuenta el directorio
node_modules. Y que no se compile al guardar. Por defecto el servidor de Angular ya compila por
cada vez que se guarda el fichero, con esta configuracin (en true) estamos duplicando la
compilacin por cada vez que se guarde.
Rutas
Consideraciones
Las rutas se crean en el archivo src/app/app.routes.ts el cual es necesario crearlo.
redirectTo: 'home'
Importamos la ruta:
<router-outlet></router-outlet>
Implementamos la Navegacin y la .claseCSS automtica:
path: 'heroes/:id',
verHeroe( idx:number ){
this.router.navigate(['/heroe', idx]);
}
bsqueda.component.ts utilizar el [routerLink] para poder buscar la ruta del artsta (desde la raiz,
usando el / antes del nombre de la ruta) y redireccionar as a la ruta especficada:
Servicios
Consideraciones:
Crear el respectivo servicio en el directorio de los servicios
src/app/servicios/heroes.service.ts
Podemos hacerlo usando Angular Cli: ng g s servicios/heroes.service.ts
En el constructor del componente definimos una propiedad privada del tipo del servicio:
private _heroesService:HeroesService. Cuando se ejecute el constructor del componente,
automticamente ejecutar el constructor del servicio.
El constructor se ejecuta antes del ngOnInit.
Crear una funcin que reciba un trmino de bsqueda y haga la concatenacin de la query y luego
retorne la respuesta usando el objeto map que devuelve una respuesta la cual ser manipulada por
una funcin de flecha.
Autenticacin con Token en Spotify
Para hacer peticiones al servidor mediante envo de encabezados ser necesario importar el mdulo
Headers del @angular/http, y sumado al anterior mdulo Http, entonces tendramos la siguiente
importacin
import { Http, Headers } from @angular/http;
Creamos una variable que sea instancia de Headers dentro del mtodo getArtistas y hacemos
algunas otras configuraciones:
Creacin del mtodo buscarArtista() dentro del componete.ts correspondiente. Esta funcin recibe
el trmino de bsqueda que se escribe en la caja de texto:
ngStyle:
Cmo usarlo:
<some-element [ngStyle]="{'font-style': styleExp}">...</some-element>
<some-element [ngStyle]="{'max-width.px': widthExp}">...</some-element>
<some-element [ngStyle]="objExp">...</some-element>
Ej.
<p [style.fontSize.px]=tamano>
Hola mundo.. esta es una etiqueta
</p>
ngClass:
Aade clases en Angular segn una determinada condicin
Como usarlo:
Modificando en la clase:
Directivas
personalizadas
Es necesario crear un nuevo folder llamado directives dentro de app/
Creamos as:
ng g d directives/resaltado
De esta forma obtenemos el color que hemos definido en la directiva (orange). Podemos crear un
mtodo que se encargue de hacer el cambio de color. El cambio incluye todo este cdigo:
ngSwitch Multiples opciones con una sola decisin:
Nos permite coger una condicin y aplicar multiples opcione con ella. Para el caso creamos un
nuevo componente llamado ngswitch: ng g c componentes/ngswitch -is. Con el plugin de atom es
posible usar un shorcut llamado ng2-switch.
Es necesario siempre usar la pgina de rutas en app/app.routes.ts y importar todos los mdulos
principales que deseamos rutear en la aplicacin principal. Aadimos la ruta en el app.module.ts y
en el app.component.html usamos el <router-outlet></router-outlet> respectivo.
Crear componente dentro de otro ya creado anteriormente
Qu pasara si necesitaramos crear un nuevo componente, pero dentro de uno ya creado
anteriormente? Ser necesario utilizar el flag flat. Por ejemplo crearemos el componente
usuarioNuevo dentro del componente usuario que ya existe en el proyecto:
El router-outlet lo aadimos debajo del men de navegacin para que ah se renderizen todas las
rutas:
Importamos el usuario.routes.ts:
Obteniendo el parmetro
del padre desde las rutas hijas
1. Para obtener los parmetros del padre es necesario hacer lo siguiente desde el
usuario.component.ts necesitamos importar el ActivatedRoute de @angular/router. Ojo que
usuario.component.ts forma parte del las pginas principales de la aplicacin principal, por
tanto no es una ruta hija. Desde ah podremos enviar el parmetro hacia las rutas hijas.
2. Ingresamos a una ruta hija (por ejemplo usuario-nuevo.component.ts) hacemos lo mismo
que en usuario.component.ts pero aadimos el .parent a la hora de solicitar los parmetros
de la ruta. Con eso indicamos que buscamos todos los parmetros del padre:
Ciclo de vida
completo de un componente
ngOnInit:
Se dispara cuando el componente se est inicializando y despues del primer onchanges
ngOnChanges:
Se dispara cuando la data de las propiedades cambian de alguna manera
ngDoCheck:
Durante cada revisin del ciclo de deteccin de cambios.
ngAfterContentInit:
Se dispara despues de insertar algn contenido: <app-algun-contenido>
ngAfterContentChecked:
Se dispara despues de la revisin del contenido intertado.
ngAfterViewInit:
Despues de la inicializacin del componente o de los componentes hijos.
ngAfterViewChecked:
Se dispara despues de cada una de la revisin de los componentes hijos
ngOnDestroy:
Se dispara cuando nos movemos de vista o este elemento se va a destruir, incluso si hacemos un
ngIf del elemento.
Ejemplo de uso:
Importamos las respectivas directivas de @angular/core
Variables locales
Son variables que se usan dentro del template o plantilla. Solo estn disponibles en el template, no
se pueden usar en la clase del componente. Es importante mencionar que estas variables solo
trabajan con objetos y es necesario convertir el elemento html en un objeto y lo hacemos usando
ngModel. La directiva ngModel trabaja conjuntamente con el atributo "name" por tanto es necesario
usarlo.
ejemplo:
<input type="text" class="form-control" id="codigo" name="codigo" ngModel #codigo >
{{ codigo.value }}
Grupo de objetos
Creamos un contenedor y usamos la directiva ngModelGroup y a la variable de grupo debemos
asignarle el ngModelGroup como valor
{{ form.value | json }}
Esto har que "nombre" est disponible dentro del marcado del formulario y podemos hacer
validaciones de la siguiente forma:
ng-pristine
Est con su valor por defecto.
ng-valid
Est pasando todas las reglas de validacin
ng-dirty
Si el campo ya contiene informacin
El atributo "required" hace que un elemento sea invlido por defecto (en la mayora de los casos, a
menos que definamos un valor por defecto)
Podramos usar otros atributos de validacin como minlenght, maxlength, etc.
Caja de bananas
usaremos la caja de bananas [(ngModel)]="elnombre"
Setear datos por defecto en una sola direccin
Configuraremos lo siguiente en el componente.ts correspondiente:
usuario:Object = {
nombre: null,
apellido: null,
correo: null,
pais: "Espaa",
codigo: "ESP",
sexo: "hombre",
acepta: false
}
Combobox (select)
Poner el valor por default (selected)
<select name="pais" [(ngModel)]="usuario.pais" class="form-control">
<option value="">Seleccione un pas</option>
<option
*ngFor="let pais of paises"
[value]="pais.nombre"
[selected]="pais.codigo === usuario.codigo"> {{ pais.nombre }} </option>
</select>
Radio:
Entonces:
<label
*ngFor="let s of sexos"
class="custom-control custom-radio">
<input [(ngModel)]="usuario.sexo"
name="sexo"
[value]="s"
type="radio"
class="custom-control-input">
<span class="custom-control-indicator"></span>
<span class="custom-control-description">{{ s }}</span>
</label>
Checkboxes
<label class="col-2 col-form-label">Acepta</label>
<div class="col-md-8">
<label class="custom-control custom-checkbox">
<input
[(ngModel)]="usuario.acepta"
name="acepta"
type="checkbox" class="custom-control-input">
<span class="custom-control-indicator"></span>
<span class="custom-control-description">Acepta las condiciones</span>
</label>
</div>
Sintaxis de FormGroup:
'nombre_campo' : new FormGroup(
'Valor por defecto',
REGLAS DE VALIDACIN,
REGLAS DE VALIDACIN ASINCRONAS)
constructor(){
this.forma = new FormGroup({
'nombre': new FormControl('Fernando'),
'apellido': new FormControl(),
'correo': new FormControl()
});
}
guardarCambios(){
console.log( this.forma.value );
console.log( this.forma );
}
Validators.required,
Validators.pattern("[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$")
])
});
Otras formas:
forma.controls[nombre].errors?.required
!forma.controls[nombre].errors?.minlength
usuario:Object = {
nombrecompleto: {
nombre: "Fernando",
apellido: "Herrera",
},
correo: "fernandoherrera@gmail.com"
}
Hacemos lo siguiente:
<div
*ngIf="!forma.get('nombrecompleto.nombre').errors?.minlength"
class="form-contro-feedback"
[ngClass]="{ 'has-danger': !forma.get('apellido').valid }">
Por lo menos 3 caracteres
</div>
</div>
Primera forma
this.forma = new FormGroup({
'nombrecompleto': new FormGroup({
'nombre': new FormControl(this.usuario.nombrecompleto.nombre, [
Validators.required,
Validators.minlength(3)
]),
'apellido': new FormControl(this.usuario.nombrecompleto.apellido,
Validators.required )
}),
'correo': new FormControl(this.usuario.correo, [
Validators.required,
Validators.pattern("[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,3}$")
])
})
Segunda forma
Si el objeto usuario responde a la misma estructura del FormGroup, entonces podemos hacer lo
siguiente en el cdigo del componente.ts
this.forma.setValue( this.usuario );
El componente FormArray
Continuando con el arreglo de opciones anterior, es necesario importar el FormArray
import { FormArray } from '@angular/forms'
En la vista
<div class="form-group row">
<label class="col-2 col-form-label">Correo</label>
</div>
<button
(click)="agregarPasatiempo()"
type="button" class="btn btn-primary">Agregar</button>
</div>
agregarPasatiempo(){
(<FormArray>this.forma.controls['pasatiempos']).push(
new FormControl('', Validators.required )
)
}
<input
[formControlName]="i"
type="text"
class="form-control">
</div>
<button
(click)="agregarPasatiempo()"
</div>
Validaciones personalizadas
Validar contraseas
this.forma.controls['password2'].setValidators([
Validators.required,
this.noIgual.bind(this.forma)
]);
Es importante mencionar que es necesaria la utilizacin del mtodo bind para indicarle a la funcin
noIgual el contexto de this.forma.
Creamos un validador
'username': new FormControl('',Validators.required, this.existeUsuario ),
setTimeout( ()=> {
resolve( { existe:true } )
}else{
resolve( null )
}, 3000);
}
)
return promesa;
Le
ponemos un nombre a nuestra App, seleccionamos Single Page Web Application y elegimos
crear. Nos pregunta qu tecnologa estamos usando para nuestra aplicacin web, elegimos
Angular 2.
Instalar Auth0
Nos nuestra cmo instalar Auth0:
npm install save auth0-js
Copiar y pegar el link del CDN:
Refactorizando el Navbar
Refactorizar el navbar.component.ts
Servicio de bloqueo CanActivate AuthGuard
Modificar el navbar.component.html de tal forma que solo se muestre la ruta protegida en caso el
usuario est autenticado:
Prevenir ingresar
a una pgina
utilizando un servicio:
ng g s servicios/authGuard
Importarmos el servicio en el app.module.ts y lo aadimos al arreglo de los Providers.
Tambin recibiremos el
next y el state en el mtodo canActivate:
Como protegemos una ruta?
Debemos ir al archivo de rutas y hacer la siguiente refactorizacin:
Iniciando el proyecto
El objetivo principal es dominar peticiones get, post, put, delete usando servicios REST. Usaremos
la RestFull API de Firebase.
ng new heroesapp
Vamos a firebase y si tenemos usuario de gmail ya tenemos cuenta en Firebase.
Hacemos clic en agregar proyecto. Ponemos el nombre del proyecto (heroesapp) y el pas (Peru) y
hacemos clic en crear proyecto.
Tendremos la siguiente pantalla:
El
Damos clic a Publicar, nos aparecer un mensaje de color rojo indicandonos los peligros de la
configuracion que acabamos de dar a nuestra app. Esto se puede cambiar luego.
Hacemos clic en descartar.
Para empezar creamos la siguiente estructura en nuestra base de datos:
Si hacemos clic sobre la URL esta va a cambiar dependiendo del elemento que seleccionemos. Por
ejemplo si hacemos clic sobre heroesapp-5e938 se mostrar un enlace, si hacemos clic sobre solo
heroes se mostrar otro enlace, y as si hicieramos clic sobre cualquier elemento del objeto heroes.
Estas URL las usaremos para consultar o enviar informacin. Las URL del ejemplo son:
https://heroesapp-5e938.firebaseio.com/heroes
https://heroesapp-5e938.firebaseio.com/heroes/1
https://heroesapp-5e938.firebaseio.com/heroes/1/casa
<hr>
<div class="row">
Nuevo
</button>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="table-responsive">
<table class="table">
<thead class="thead-inverse">
<tr>
<th>#</th>
<th>Nombre</th>
<th>Casa</th>
<th>Opciones</th>
</tr>
</thead>
<tbody>
<td></td>
<td></td>
<td></td>
<td></td>
</tbody>
</table>
</div>
</div>
</div>
Modificamos los botones de los *.component.html
<button
[routerLink]="['/heroe', 'nuevo']"
class="btn btn-outline-primary" type="button" name="button">
Nuevo Heroe
</button>
<button
[routerLink]="['heroes']"
class="btn btn-outline-danger btn-sm">
Regresar
</button>
<div class="form-group">
<label for="">Casa</label>
<select name="casa" class="form-control" [(ngModel)]="heroe.casa">
<option value="Marvel">Marvel</option>
<option value="DC">DC</option>
</select>
</div>
<div class="form-group">
<label for="">Bio</label>
<textarea name="bio" [(ngModel)]="heroe.bio" class="form-control"></textarea>
</div>
<div class="form-group">
<button type="submit" [disabled]="!forma.valid" class="btn btn-outline-primary btn-
sm">Guardar cambios</button>
</div>
</form>
</div>
</div>
heroesURL:string = "https://heroesapp-5e938.firebaseio.com/heroes.json";
constructor( private http:Http) { }
nuevoHeroe( heroe:Heroe){
let body = JSON.stringify( heroe );
let headers = new Headers({
'Content-Type': 'application/json'
});
Modificamos el heroe.component.html
Aadimos un botn para ingresar un nuevo heroe y dejar el formulario en su estado pristine:
Le hemos
pasado el objeto
de la #forma
a la funcin
agregarNuevo
Obtener listado
de todos
los hroes
(GET)
Modificamos el heroes.component.ts
Importamos el servicio
inyectamos el servicio en el constructor
constructor( private _heroesService:HeroesService)
Creamos la variable heroes de tipo any.
Hacemos el llamado al mtodo getHeroes para obtener la data.
Creamos un Pipe
Creamos app/pipes/keys
Modificamos el heroes.component.html
Eliminar registros (HTTP DELETE)
Creamos el botn de Editar
Actualizar el Pipe para que est pendiente del ciclo de cambios que
haga Angular
Esto es para el caso del error que ocurre cuando intentas eliminar un hroe de la lista de hroes.
Pasa que en el ngFor cuando encuentra un hroe que ya no existe, angular revienta dado que no se
enter que ya fue eliminado. Con esto resolvemos el problema.
Esto quiere decir que tiene que estar pendiente del ciclo de cambios que haga angular. Esto lo
hacemos porque cuando eliminamos un elemento de un arreglo, ocurre un error.
Resumen:
Es necesario importar el modulo Http y Headers de @angular/http
Es necesario importar la funcin map de rxjs/Rx
Para enviar usando post es necesario enviar un objeto en formato string, para eso usaremos
JSON.stringify( objeto ) y le pasamos el objeto.
Estructura de una peticin POST:
Esta peticin regresa un observable, para ello es necesario retornar la peticin.
let url = "url al recurso rest" <- Esta url podra ser configurada de forma global en la clase, no tiene
que estar necesariamente declarada en el mtodo.
let body = JSON.stringify( heroe ); <- El heroe viene como parmetro al mtodo del servicio.
let headers = new Headers({
'Content-Type': 'application/json'
});
guardar(){
this._miServicio.nuevoHeroe( this.heroe )
.subscribe( data=>{
console.log( data ) <- aqu devuelve la data que le devuelve el
servicio.
})
}
Estructura de una peticin PUT:
La estructura es la misma, lo que cambia es el "nodo" hacia donde se enviar la actualizacin. En el
caso de Firebase es necesario estar sobre el nodo que deseamos actualizar (Entiendase "nodo" como
documento a actualizar). Se debe enviar adems en la URL la clave que deseamos actualizar.
Bsicamente trabajaremos con las URL, dado que todo lo dems es lo mismo que con POST pero
en este caso con PUT.
Para acceder a los parmetros de la ruta es necesario usar el mdulo: ActivatedRoute del
@angular/router, inicializarlos en el constructor y usarlo en el mtodo constructor dado que es el
primero que se ejecuta al cargar el script. El objeto "params" retorna un observable por tanto
tambin es necesario suscribirnos a el:
Esta peticin al final retorna un observable al cual debemos subscribirnos para leer la info:
this._miServicio.getHeroe( this.id )
.subscribe( data => this.heroe = data );