Je ne peux pas y accéder de la même manière que dans les documents Angular, donc je dois d'abord saisir l'instance FormGroup et y trouver une instance FormControl .. Je me demande pourquoi? Cet exemple fonctionne:
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<div class="form-group">
<label for="username">Username</label>
<input
type="text"
name="username"
class="form-control"
formControlName="username"
>
<div *ngIf="myForm.controls.username.invalid" class="alert alert-danger">
username is required
</div>
</div>
Bien que cela génère une erreur (différence entre ceux-ci uniquement dans l'instruction * ngIf):
<form [formGroup]="myForm" (ngSubmit)="onSubmit()">
<div class="form-group">
<label for="username">Username</label>
<input
type="text"
name="username"
class="form-control"
formControlName="username"
>
<div *ngIf="username.invalid" class="alert alert-danger">
username is required
</div>
</div>
Impossible de lire la propriété "non valide" de non définie
form.component:
import {Component} from '@angular/core';
import {FormGroup, FormControl, Validators} from '@angular/forms';
@Component({
selector: 'sign-up',
templateUrl: 'app/sign-up.component.html'
})
export class SignUpComponent {
myForm = new FormGroup({
username: new FormControl('username', Validators.required),
password: new FormControl('', Validators.required),
});
}
Il génère une erreur car vous n'avez pas de variable appelée username
ou password
.
Pour résoudre ce problème, vous pouvez procéder comme suit:
export class SignUpComponent implements OnInit {
myForm: FormGroup;
usernameCtrl: FormControl;
passwordCtrl: FormControl;
ngOnInit() {
this.usernameCtrl = new FormControl('username', Validators.required);
this.passwordCtrl = new FormControl('', Validators.required);
this.myForm = new FormGroup({
username: this.usernameCtrl,
password: this.passwordCtrl
});
}
}
... ou en utilisant FormBuilder
:
export class SignUpComponent implements OnInit {
myForm: FormGroup;
usernameCtrl: FormControl;
passwordCtrl: FormControl;
constructor(private formBuilder: FormBuilder) { }
ngOnInit() {
this.usernameCtrl = this.formBuilder.control('username', Validators.required);
this.passwordCtrl = this.formBuilder.control('', Validators.required);
this.myForm = this.formBuilder.group({
username: this.usernameCtrl,
password: this.passwordCtrl
});
}
}
Vous pouvez maintenant l'utiliser directement dans le modèle, comme ceci:
<div class="alert alert-danger" *ngIf="usernameCtrl.invalid">
username is required
</div>
De plus, si vous préférez, vous pouvez utiliser [formControl]
au lieu de formControlName
:
<input
type="text"
name="username"
class="form-control"
[formControl]="usernameCtrl">
Vous pouvez résoudre ce problème en utilisant un groupe de formulaires et en définissant les getters correspondants dans votre contrôleur. Pour atteindre cet objectif:
Dans le contrôleur:
1) Supprimer la définition et l'initialisation des variables de contrôle de formulaire
usernameCtrl: FormControl;
passwordCtrl: FormControl;
...
this.usernameCtrl = this.formBuilder.control('username',Validators.required);
this.passwordCtrl = this.formBuilder.control('', Validators.required);
2) Remplacez l'initialisation du groupe de formulaires par
ngOnInit() {
this.myForm = this.formBuilder.group({
username: ['usename', Validators.required]
password: ['', Validators.required]
});
}
3) Ajoutez les getters
get username() { return this.myForm.get('username'); }
get password() { return this.myForm.get('password'); }
Dans le modèle:
1) ajoutez un div parent avec [formGroup] = "MyForm"
<div [formGroup]="myForm">
...
</div>
2) changer [formControl] = "usernameCtrl" pour forcontrolName = username et * ngIf = "usernameCtrl.invalid" pour * ngIf = "username.invalid"
<input type="text"
name="username"
class="form-control"
formControlName="username">
<div *ngIf="username.invalid" class="alert alert-danger">
username is required
</div>
3) changez [formControl] = "passwordCtrl" pour forcontrolName = password et * ngIf = "passwordCtrl.invalid" pour * ngIf = "password.invalid" te.
<input type="text"
name="password"
class="form-control"
formControlName="password">
<div *ngIf="password.invalid" class="alert alert-danger">
password is required
</div>
Pour moi ça marche:
form.component:
getFormControl(name) {
return this.Form.get(name);
}
modèle:
<input
type="text"
name="username"
class="form-control"
formControlName="username"
>
<div *ngIf="getFormControl('username').invalid" class="alert alert-danger">
username is required
</div>