Contenido del curso
Introducción a Angular 4
Setup del Ambiente de Trabajo
Conceptos Básicos
- 9

Para qué nos sirven los Módulos y Componentes
08:10 min - 10

Tipos de Data Binding y String Interpolation
05:05 min - 11

Property Binding
06:04 min - 12

Event Binding
03:04 min - 13

ngModel y two way binding en Angular
05:12 min - 14

Directivas en Angular 4 y ngFor
07:39 min - 15

Cómo usar ngIf en Angular 4.0
03:04 min - 16

Instalando librerías con NPM (Google Maps)
06:48 min
Directivas
Angular UI
Ruteo
- 24

Qué hace el router en Angular 4
03:11 min - 25

Implementación de Rutas en el Proyecto
07:36 min - 26

Href vs router link: navegación angular
02:27 min - 27

Resaltando el link activo con CSS para indicar visualmente en que componente nos encontramos
01:53 min - 28

Parámetros de ruta con routerLink en Angular
06:01 min - 29

Parámetros tipo Query
03:53 min - 30

Creando una vista de detalle para el proyecto
09:06 min - 31

Página de contacto Angular desde cero
07:45 min
Servicios
- 32

Servicios en Angular para compartir datos
00:58 min - 33

Creando nuestro propio servicio
07:11 min - 34

Configurando Firebase en nuestro proyecto
05:12 min - 35

Guardando Records en Firebase
12:20 min - 36

Obteniendo records desde Firebase
08:40 min - 37

Obteniendo coordenadas usando Geocoding
13:45 min - 38

Reto: Crear una vista para editar records
09:29 min - 39

Mostrando marcadores en el Mapa de Google
03:02 min
Conexión Remota (Http y Sockets)
Pipes
Animaciones en Angular
Testing en Angular
Autenticación y Protección de Rutas
- 59

Cómo funcionan los JSON Web Tokens
03:05 min - 60

Preparación de vistas para login y registro
11:58 min - 61

Registrando usuarios
07:29 min - 62

Loggeando usuarios
07:18 min - 63

Guardias canActivate en Angular: Proteger rutas con autenticación
11:09 min - 64

Cómo integrar Facebook login con Firebase
09:08 min - 65

Logout en Angular con Firebase
05:28 min
RxJS
- 66

Cómo funciona RxJS con metáfora de oficina
02:09 min - 67

Mostrar email del usuario logueado en Angular
06:32 min - 68

Uso de los Observables
04:30 min - 69

Cómo implementar type ahead con Observables y RxJS
10:43 min - 70

Implementar formularios reactivos con type ahead
Viendo ahora - 71

Cómo rellenar campos automáticamente con Google
01:28 min
Publicando nuestro proyecto
Fin del curso
Sesiones en vivo
Contenido Bonus
Implementar formularios reactivos con type ahead
Resumen
Conecta un campo de búsqueda con resultados en tiempo real de Google usando Angular, RxJS y Bootstrap. Aquí verás cómo estructurar el HTML, activar formularios reactivos, renderizar una lista con async y optimizar llamadas con debounceTime para un type ahead fluido y veloz.
¿Cómo implementar type ahead con Angular, RxJS y Google?
Primero, se prepara el HTML para capturar la entrada y mostrar resultados. El input se enlaza a un FormControl llamado searchField. Cada tecla genera eventos que, vía RxJS, hacen la llamada al API de Google, formatean la respuesta y alimentan un stream de resultados. Se renderiza una lista con Bootstrap y el async pipe para manejar la naturaleza asíncrona.
¿Cómo se pinta la lista con async y Bootstrap?
- Input de texto con clase de Bootstrap para estilo.
- Directiva reactiva [formControl] enlazada a searchField.
- Lista sin ordenar con clases list-group y list-group-item.
- Iteración con ngFor sobre results$ usando el async pipe.
<form> <div class="well"> <label>Buscar negocio en Google.</label> <input type="text" class="form-control" [formControl]="searchField" /> <ul class="list-group"> <li class="list-group-item" *ngFor="let result of results$ | async"> {{ result.formatted_address }} </li> </ul> </div> </form>
- La propiedad mostrada es formatted_address del API de Google: dirección legible para humanos.
- Tip: revisar clases de Bootstrap para que se apliquen estilos correctos.
¿Qué error de Angular aparece y cómo se corrige?
Al usar [formControl] puede aparecer: "Can't bind to 'formControl' since it isn't a known property of 'input'". Causa: los formularios reactivos no se cargan por defecto. Solución: importar ReactiveFormsModule en AppModule.
// app.module.ts import { ReactiveFormsModule } from '@angular/forms'; @NgModule({ imports: [ BrowserModule, ReactiveFormsModule, ] }) export class AppModule {}
- Tras guardar y recargar, el input ya actúa como control reactivo.
- Útil abrir la pestaña Network en Chrome para observar el stream de llamadas.
¿Cómo reducimos llamadas y mejoramos performance?
Teclear rápido dispara muchos requests; incluso algunos fallan. Para evitar saturación, se usa debounceTime antes de switchMap. Así se espera un tiempo entre teclas y solo se ejecuta la última intención del usuario.
// crear.component.ts (fragmento) this.results$ = this.searchField.valueChanges.pipe( debounceTime(500), switchMap(term => this.search(term)), map(resp => this.format(resp)), map(list => this.onlyAddresses(list)) );
- debounceTime(500): espera medio segundo entre eventos de tecleo antes de llamar al API.
- Aún es rápido y reduce drásticamente la cantidad de requests.
¿Qué operadores se concatenan y para qué sirven?
- debounceTime: controla frecuencia de eventos para mejorar rendimiento.
- switchMap: cancela búsquedas anteriores y usa solo la más reciente.
- map (dos veces): transforma la respuesta y extrae los datos necesarios.
- async (pipe en plantilla): suscribe y desuscribe automáticamente al stream; ideal para datos asíncronos y escenarios con sockets en RxJS.
¿Qué sigue para completar la experiencia?
Al hacer clic en un resultado, se puede autocompletar el formulario con: calle y número, ciudad y país. El API ya provee esa data en address_components (por ejemplo: street_number, long_name). La tarea consiste en capturar el clic en el ítem y poblar esos inputs.
- Ejemplos probados: "Universidad Nacional" y "Juárez dos" muestran múltiples resultados bien formateados.
- Habilidades aplicadas: Angular Reactive Forms, RxJS operators, Bootstrap, manejo de API de Google, diagnóstico con Network.
¿Te animas a implementar el clic en la lista y llenar las tres cajas? Comparte tu código y una captura en los comentarios para revisar juntos.