Vimos en los conceptos anteriores como trabajar con formularios reactivos en Angular, pero siempre utilizando un input de tipo text o un textarea. Ahora veremos como configurar los controles checkbox, radio y select.
Confeccionar un formulario que permita al usuario ingresar un valor decimal y luego pueda seleccionar:
Crearemos primero el proyecto:
ng new proyecto011
Modificamos la vista de la componente que muestra el formulario reactivo (app.component.html):
<form [formGroup]="formularioConversion" (ngSubmit)="submit()">
<p>Ingrese número decimal:
<input type="text" formControlName="numerodecimal">
</p>
<p>Convertir a:<br>
<input type="radio" formControlName="base" value="octal">Octal
<input type="radio" formControlName="base" value="hexadecimal">Hexadecimal
</p>
<p>Elevar a:<br>
<select formControlName="potencia">
<option>2</option>
<option>3</option>
<option>4</option>
</select>
</p>
<p><input type="checkbox" formControlName="largo">Mostrar cantidad de dígitos
</p>
<p><button type="submit">Confirmar</button></p>
</form>
<div>
<p>Conversion:{{conversion}}</p>
<p>Potencia:{{potenciaNumero}}</p>
<p>Cantidad de dígitos:{{cantidad}}</p>
</div>
<router-outlet />
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 { RouterOutlet } from '@angular/router';
import { ReactiveFormsModule, FormControl, FormGroup } from '@angular/forms';
@Component({
selector: 'app-root',
imports: [RouterOutlet, ReactiveFormsModule],
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
conversion = '';
potenciaNumero = '';
cantidad = '';
formularioConversion = new FormGroup({
numerodecimal: new FormControl(''),
base: new FormControl('octal'),
potencia: new FormControl('2'),
largo: new FormControl(true)
});
submit() {
if (this.formularioConversion.value.numerodecimal) {
if (this.formularioConversion.value.base == "hexadecimal")
this.conversion = parseInt(this.formularioConversion.value.numerodecimal).toString(16);
if (this.formularioConversion.value.base == "octal")
this.conversion = parseInt(this.formularioConversion.value.numerodecimal).toString(8);
if (this.formularioConversion.value.numerodecimal && this.formularioConversion.value.potencia)
this.potenciaNumero = Math.pow(parseInt(this.formularioConversion.value.numerodecimal), parseInt(this.formularioConversion.value.potencia)).toString();
if (this.formularioConversion.value.largo)
this.cantidad = this.formularioConversion.value.numerodecimal.length.toString();
}
}
}
Creamos un objeto de la clase FormGroup y le pasamos un objeto literal con la referencia a los 4 controles de formulario que necesitamos:
formularioConversion = new FormGroup({
numerodecimal: new FormControl(''),
base: new FormControl('octal'),
potencia: new FormControl('2'),
largo: new FormControl(true)
});
El atributo base se asocia a los controles 'radio' de la vista, he indicamos que aparezca seleccionado por defecto aquel que almacena en value el valor 'octal':
<p>Convertir a:<br>
<input type="radio" formControlName="base" value="octal">Octal
<input type="radio" formControlName="base" value="hexadecimal">Hexadecimal
</p>
El control HTML select se asocia al atributo 'potencia', indicando que se muestre seleccionada la opción con valor '2':
potencia: new FormControl('2'),
La vista para este FormControl es:
<p>Elevar a:<br>
<select formControlName="potencia">
<option>2</option>
<option>3</option>
<option>4</option>
</select>
</p>
Finalmente para el control checkbox indicamos que se muestre seleccionado por defecto al cargar el formulario:
largo: new FormControl(true)
Cuando se presiona el botón se ejecuta el método 'submit', donde efectuamos las distintas operaciones según los valores seleccionados en el formulario:
submit() {
if (this.formularioConversion.value.numerodecimal) {
if (this.formularioConversion.value.base == "hexadecimal")
this.conversion = parseInt(this.formularioConversion.value.numerodecimal).toString(16);
if (this.formularioConversion.value.base == "octal")
this.conversion = parseInt(this.formularioConversion.value.numerodecimal).toString(8);
if (this.formularioConversion.value.numerodecimal && this.formularioConversion.value.potencia)
this.potenciaNumero = Math.pow(parseInt(this.formularioConversion.value.numerodecimal), parseInt(this.formularioConversion.value.potencia)).toString();
if (this.formularioConversion.value.largo)
this.cantidad = this.formularioConversion.value.numerodecimal.length.toString();
}
}
Si ejecutamos la aplicación tenemos una interfaz similar a:

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