Implementar formularios reactivos con type ahead
Clase 70 de 80 • Curso de Angular 4
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
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.