exportclassBasicFormComponentimplementsOnInit {// Crear un form control nameField =newFormControl('soy un control');ngOnInit() {// Optiene valores desde la vista por medio de una suscripcionthis.nameField.valueChanges.subscribe((name) => {console.log(`Name changed to: ${name}`); }); }}
// Enlazar el form cotrol con el template<inputtype="text"[formControl]="nameField" />// Obtener el valor{{ nameField.value }}// Obtener el objeto value<code> <pre> {{ nameField | json }} </pre></code>
<select id="category" [formControl]="categoryField">
<option *ngFor="let item of array" [value]="item.key">{{item.name}}</option>
</select>
<!-- o con ngVAlue para objectos -->
<select id="category" [formControl]="categoryField">
<option *ngFor="let item of array" [ngValue]="item">{{item.name}}</option>
</select>
<!-- También se puede enviar todo el objeto y en el componente usar JSON.parse para convertirlo-->
<!-- <option *ngFor="let item of array" [value]="item | json">{{item.name}}</option> -->
Para setear por defecto el valor del select que utiliza ngValue, se puede usar por ejemplo:
La clase FormControl recibe aparte del valor, puede recibir una o varias validaciones sincronas y asíncronas.
newFormControl('', [Validators.required]);
<p>
Name: {{ nameField.value }}
<input type="text" [formControl]="nameField" />
<button [disabled]="nameField.hasError('required')" (click)="getNameValue()">
Get Value
</button>
<!-- ó -->
<button [disabled]="nameField.invalid" (click)="getNameValue()">
Get Value
</button>
</p>
una mala préctica es mostrar el error desde el antes de utilizar el inputpara esto podemos usar la propiedad touched.
Un FormGroup es un grupo de FormContols y sirve para manejar todo el formulario, al igual que el FormControl tiene validaciones el FormGroup también pero a nivel de todo el form.
... form =newFormGroup({ name:newFormControl('', [Validators.required,Validators.maxLength(10)]), }); get nameField() {returnthis.form.get('name'); }save(e: MouseEvent) {e.preventDefault()... }...
<div> <inputplaceholder="password"formControlName="confirmPassword"type="password"> <div*ngIf="form.get('confirmPassword').touched && form.errors"> <mat-error*ngIf="form.hasError('match_password')"> No hace match </mat-error></div>
Las validaciones grupales dependen de uno o mas campos del mismo formulario y lo validan todo.
Validaciones asincrónicas
Un ejemplo sería al intentar crear una categoría duplicada