Cuando trabajamos con formularios reactivos en Angular normalmente creamos un FormGroup para agrupar los controles visuales que se les asocian un objeto de la clase FormControl a cada uno.
Podemos crear dentro de un FormGroup otro FormGroup que agrupe un conjunto de controles relacionados.
Confeccionar un formulario que permita cargar los siguientes datos de un alumno: dni, nombre, materia y sus tres notas. Agrupar las tres notas dentro de un FormGroup anidado al principal.
Al presionar un botón mostrar un mensaje si se encuentra aprobado (todas las notas mayores o iguales a 4)
Crearemos primero el proyecto:
ng new proyecto058
Importamos la clase 'ReactiveFormModule' modificando el archivo 'app.module.ts':
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { ReactiveFormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
@NgModule({
declarations: [
AppComponent
],
imports: [
BrowserModule,
ReactiveFormsModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
Modificamos la vista de la componente que muestra el formulario reactivo (app.component.html):
<form [formGroup]="formAlumno" (ngSubmit)="submit()">
<p>Dni:
<input type="text" formControlName="dni">
</p>
<p>Nombre:
<input type="text" formControlName="nombre">
</p>
<div formGroupName="notas">
<p>Primer nota:
<input type="text" formControlName="nota1">
</p>
<p>Segunda nota:
<input type="text" formControlName="nota2">
</p>
<p>Tercer nota:
<input type="text" formControlName="nota3">
</p>
</div>
<p><button type="submit">Confirmar</button></p>
</form>
<div>
<p>Resultado:{{resultado}}</p>
</div>
Analizaremos este archivo en conjunto luego de presentar 'app.component.ts'
La clase asociada a la vista es (app.component.ts):
import { Component } from '@angular/core';
import { FormGroup, FormControl } from '@angular/forms';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
resultado!:string;
formAlumno = new FormGroup({
dni: new FormControl(''),
nombre: new FormControl(''),
notas: new FormGroup({
nota1: new FormControl(''),
nota2: new FormControl(''),
nota3: new FormControl('')
})
});
submit() {
let nota1=parseInt(this.formAlumno.value.notas.nota1);
let nota2=parseInt(this.formAlumno.value.notas.nota2);
let nota3=parseInt(this.formAlumno.value.notas.nota3);
if (nota1>=4 && nota2>=4 && nota3>=4)
this.resultado="El alumno queda aprobado por esas notas";
else
this.resultado="El alumno no aprueba por esas notas";
}
}
Creamos un objeto de la clase FormGroup y dentro de este otro objeto de la clase FormGroup que agrupa las tres notas:
formAlumno = new FormGroup({
dni: new FormControl(''),
nombre: new FormControl(''),
notas: new FormGroup({
nota1: new FormControl(''),
nota2: new FormControl(''),
nota3: new FormControl('')
})
});
Esto provoca en la vista que cuando asociemos las tres notas debemos agruparlas dentro de un etiqueta HTML que defina una propiedad 'formGroupName':
<div formGroupName="notas">
<p>Primer nota:
<input type="text" formControlName="nota1">
</p>
<p>Segunda nota:
<input type="text" formControlName="nota2">
</p>
<p>Tercer nota:
<input type="text" formControlName="nota3">
</p>
</div>
Cuando se presiona el botón se verifica si las tres notas ingresadas son mayores o iguales a 4 para mostrar por pantalla si el alumno se encuentra aprobado o no:
submit() {
let nota1=parseInt(this.formAlumno.value.notas.nota1);
let nota2=parseInt(this.formAlumno.value.notas.nota2);
let nota3=parseInt(this.formAlumno.value.notas.nota3);
if (nota1>=4 && nota2>=4 && nota3>=4)
this.resultado="El alumno queda aprobado por esas notas";
else
this.resultado="El alumno no aprueba por esas notas";
}
Si ejecutamos la aplicación tenemos una interfaz similar a:

Podemos probar esta aplicación en la web aquí.