Vimos en los conceptos anteriores como trabajar con formularios reactivos en Angular, pero siempre utilizando un input de tipo texto 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 proyecto057
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]="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>
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 {
conversion!: string;
potenciaNumero!: number;
cantidad!: number;
formularioConversion = new FormGroup({
numerodecimal: new FormControl(''),
base: new FormControl('octal'),
potencia: new FormControl('2'),
largo: new FormControl(true)
});
submit() {
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);
this.potenciaNumero = Math.pow(parseInt(this.formularioConversion.value.numerodecimal), parseInt(this.formularioConversion.value.potencia));
if (this.formularioConversion.value.largo)
this.cantidad = this.formularioConversion.value.numerodecimal.length;
}
}
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.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);
this.potenciaNumero = Math.pow(parseInt(this.formularioConversion.value.numerodecimal), parseInt(this.formularioConversion.value.potencia));
if (this.formularioConversion.value.largo)
this.cantidad = this.formularioConversion.value.numerodecimal.length;
}
Si ejecutamos la aplicación tenemos una interfaz similar a:

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