Moumoune
6/3/2017 - 2:55 PM

13. Les Formulaires pilotés par le modèle

*** Extraits de code : Les Formulaires pilotés par le modèle. ***

import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';
import { FormBuilder } from '@angular/forms';

@Component({
	selector: 'my-app',
	template: `
    <form [formGroup]="form" novalidate
          (ngSubmit)="save(myForm.value, myForm.valid)">
          (ngSubmit)="save(myForm.value, myForm.valid)">
      <div formGroupName="name">
        <input formControlName="first" placeholder="First">
        <input formControlName="last" placeholder="Last">
      </div>
      <input formControlName="email" placeholder="Email">
      <button>Submit</button>
    </form>
    <p>Value: {{ form.value | json }}</p>
    <p>Validation status: {{ form.status }}</p>
 `
})
export class AppComponent implements OnInit {
	form: FormGroup;

	constructor(private fb: FormBuilder) { }

	ngOnInit(): void {
		// On initialise notre formulaire piloté par le modèle
		this.form = fb.group({
			'name': fb.group({
				first: ['',
					Validators.compose([Validators.required, Validators.minLength(3)])],
				last: ['',
					Validators.compose([Validators.required, Validators.minLength(3)])]
			}),
			email: ['',
				Validators.pattern('^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$')]
		});
	}
}
import { Component, OnInit } from '@angular/core';
import { FormControl, FormGroup, Validators } from '@angular/forms';

@Component({
	selector: 'my-app',
	template: `
    <form [formGroup]="form" novalidate
          (ngSubmit)="save(myForm.value, myForm.valid)">
          (ngSubmit)="save(myForm.value, myForm.valid)">
      <div formGroupName="name">
        <input formControlName="first" placeholder="First">
        <input formControlName="last" placeholder="Last">
      </div>
      <input formControlName="email" placeholder="Email">
      <button>Submit</button>
    </form>
    <p>Value: {{ form.value | json }}</p>
    <p>Validation status: {{ form.status }}</p>
 `
})
export class AppComponent implements OnInit {
	form: FormGroup;

	ngOnInit(): void {
		// On initialise notre formulaire piloté par le modèle
		this.form = new FormGroup({
			'name': new FormGroup({
				first: new FormControl('',
					Validators.compose([Validators.required, Validators.minLength(3)])),
				last: new FormControl('',
					Validators.compose([Validators.required, Validators.minLength(3)]))
			}),
			email: new FormControl('',
				Validators.pattern('^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$'))
		});
	}
}
/***********
* EXERCICE *
************/

/*

Voici les instructions, le formulaire sera composé des cinq champs suivants :

• Un champ firstname, qui fera partie du groupe de contrôle 'name'.
• Un champ lastname, qui fera partie du groupe de contrôle 'name'.
• Un champ email.
• un champ password, qui fera partie du groupe de contrôle 'verification'.
• Un champ passwordConfirm, qui fera partie du groupe de contrôle
'verification'.

 */

ngOnInit(): void {
	this.form = fb.group({
		name: fb.group({
			firstname: ['', Validators.compose(
				[Validators.required,
				Validators.minLength(3),
				Validators.maxLength(25)])],
			lastname: ['', Validators.compose(
				[Validators.required,
				Validators.minLength(3),
				Validators.maxLength(25)])]
		}),
		email: ['', Validators.pattern('^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$')],
		verification: fb.group({
			password: ['', Validators.compose([Validators.required, Validators.minLength(8)])],
			passwordConfirm: ['', Validators.compose([Validators.required, Validators.minLength(8)])]
		}, passwordMatchValidator)
	});
}
import { FormGroup, ValidatorFn } from '@angular/forms';

export function strongPasswordValidator(): ValidatorFn {
	return (control: AbstractControl): { [key: string]: any } => {
        // on utilise une expression régulière pour la validation
		var strongRegex = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*])(?=.{8,})");
        
        // on récupère le mot de passe du champ 'control' passé en paramètre
		const password = control.value;
		// on teste le mot de passe avec l'expression régulière
		const valid = strongRegex.test(password);
		// on retourne null si le mot de passe est assez fort, 
		// et un dictionnaire d'erreur sinon.
		return valid ? null : { 'strongPasswordError': { password } };
	};
}