Overview
Angular Day - 16 Giugno 2017
Freelance Web Developer & JavaScript enthusiast
Template-driven forms
Model-driven forms
import { ReactiveFormsModule } from "@angular/forms";
@NgModule({
...
imports: [
ReactiveFormsModule
]
})
...
Spostamento della logica di un form dal template al controller.
<form #f="ngForm" (ngSubmit)="myMethod($event)">
<input type="text"
[(ngModel)]="user.name" required>
<input type="text"
[(ngModel)]="user.surname" required>
</form>
<form [formGroup]="user" (ngSubmit)="myMethod()">
<input type="text"
formControlName="name">
<input type="text"
formControlName="surname">
</form>
singolo controllo (input, select, textarea...)
gruppo di controlli
array di controlli
classe generica
name = new FormControl('Mario');
name = new FormControl({
value: 'Mario',
disabled: true
});
name = new FormControl(
'Mario',
Validators.required
);
name = new FormControl(
'Mario',
[
Validators.required,
Validators.minLength(4)
]
);
myForm = new FormGroup({
name: new FormControl('Mario'),
surname: new FormControl('Rossi')
});
cities = new FormArray([
new FormControl('Verona'),
new FormControl('Milano'),
new FormControl('Roma')
]);
La classe ci mette a disposizione dei metodi per interagire con l'array:
Ogni controllo, estendendo questa classe, ci mette a disposizione queste proprietà:
FormGroup
FormControl
FormControl
FormArray
Custom Control
import { FormBuilder } from '@angular/forms';
@Component({
...
})
export class AppComponent {
constructor(private fb: FormBuilder){ }
}
myForm = this.fb.group({
name: 'Mario',
surname: 'Rossi',
phones: this.fb.array([])
});
myForm = new FormGroup({
name: new FormControl('Mario'),
surname: new FormControl('Rossi'),
phones: new FormArray([])
});
Diventa true nel momento in cui l'utente clicca (focus) ed esce dal controllo (blur). Il suo opposto è untouched.
Diventa true nel momento in cui cambia il valore del controllo. Il suo opposto è pristine.
Diventa true se il controllo passa tutte le validazioni. Il suo opposto è invalid.
myForm = this.fb.group({
name: '',
surname: ''
});
myForm.patchValue({
name: 'Mario'
});
myForm.patchValue({
name: 'Mario',
surname: 'Rossi'
});
myForm.setValue({
name: 'Mario'
});
myForm.setValue({
name: 'Mario',
surname: 'Rossi'
});
myForm.patchValue({
name: 'Mario',
surname: 'Rossi',
age: 18
});
myForm.setValue({
name: 'Mario',
surname: 'Rossi',
age: 18
});
Validators.required
Validators.minLength()
Validators.maxLength()
Validators.pattern()
this.myForm = this.fb.group({
name: ['', Validators.required],
surname: ['', Validators.required],
age: '18',
phones: this.fb.array([])
});
function customValidator(control: AbstractControl) {
if (...) {
return {Error: control.value}
}
return null;
};
function customValidator(myParams): ValidatorFn {
return (control: AbstractControl) => {
if (...) {
// Do something with myParams
return {Error: control.value}
}
return null;
};
}
export function nameValidator(param: string)
name: [
'',
[
Validators.required,
nameValidator('Michele')
]
]
import { AbstractControl, ValidatorFn } from '@angular/forms';
export function nameValidator(param): ValidatorFn {
return (control: AbstractControl) => {
if (control.value === param) {
return {nameError: param}
}
return null;
};
}
Possiamo creare dei validatori custom per effettuare validazioni di più controlli all'interno di un FormGroup.
cred = {
name: 'Mario',
surname: 'Rossi'
};
[...]
this.myForm = this.fb.group({
name: '',
surname: ''
},
{
validator: customCredentialsValidator(this.cred)
});
export function customCredentialsValidator(cred) {
return (control: AbstractControl) => {
const name = control.get('name');
const surname = control.get('surname');
[...]
};
};
Ultima slide!
Ricorda di dare un voto al mio talk e all'Angular Day in generale!
Grazie!
Angular Dev Ita
JavaScript Dev Ita