Quelle est la différence entre formControlName et FormControl?
j'utilise ReactiveFormsModule
D'Angular2 pour créer un composant qui contient une forme. Voici mon code:
foo.composant.ts:
constructor(fb: FormBuilder) {
this.myForm = fb.group({
'fullname': ['', Validators.required],
'gender': []
});
}
foo.composant.html (avec [formControl]
):
<div class="fields">
<div class="field">
<label>Fullname*</label>
<input type="text" [formControl]="myForm.controls.fullname"/>
</div>
</div>
<div class="inline fields">
<label for="gender">Gender</label>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="gender" checked="" tabindex="0" class="hidden" [formControl]="myForm.controls.gender">
<label>Male</label>
</div>
</div>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="gender" tabindex="0" class="hidden" [formControl]="myForm.controls.gender">
<label>Female</label>
</div>
</div>
</div>
foo.composant.html (avec formControlName
):
<div class="fields">
<div class="field">
<label>Fullname*</label>
<input type="text" formControlName="fullname"/>
</div>
</div>
<div class="inline fields">
<label for="gender">Gender</label>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="gender" checked="" tabindex="0" class="hidden" formControlName="gender">
<label>Male</label>
</div>
</div>
<div class="field">
<div class="ui radio checkbox">
<input type="radio" name="gender" tabindex="0" class="hidden" formControlName="gender">
<label>Female</label>
</div>
</div>
</div>
les deux méthodes fonctionnent. Mais je ne peux pas comprendre quelle est la différence entre utiliser [formControl]
et formControlName
.
5 réponses
je crois que vous avez raté un point important: [formGroup]
directive dans le second exemple. formControlName
est utilisé avec [formGroup]
pour sauvegarder votre formulaire plusieurs points de navigation. Par exemple:
<div>
<input type="text" [formControl]="myForm.controls.firstName"/>
<input type="text" [formControl]="myForm.controls.lastName"/>
<input type="text" [formControl]="myForm.controls.email"/>
<input type="text" [formControl]="myForm.controls.title"/>
</div>
est l'équivalent de:
<div [formGroup]="myForm">
<input type="text" formControlName="firstName"/>
<input type="text" formControlName="lastName"/>
<input type="text" formControlName="email"/>
<input type="text" formControlName="title"/>
</div>
maintenant imaginez emboîté FormGroups
:)
[formControl]
assigne une référence à la FormControl
instance que vous avez créée à la FormControlDirective
.
formControlName
assigne une chaîne pour les formes module permettant de rechercher le contrôle par son nom.
si vous créez des variables pour les contrôles, vous n'avez pas non plus besoin de .
comme L'a mentionné Harry, mais je suggère aussi d'utiliser [formGroup]
au lieu de cela parce qu'avec des formes plus compliquées cela peut devenir désordre.
constructor(fb: FormBuilder) {
this.fullName = new FormControl('', Validators.required);
this.gender = new FormControl('');
this.myForm = fb.group({
'fullname': this.fullName,
'gender': this.gender
});
}
il y a une troisième équivalence aux deux réponses fournies dans la réponse acceptée, ce qui est ceci (non recommandé):
<div [formGroup]="myForm">
<input type="text" [formControl]="firstName"/>
<input type="text" [formControl]="lastName"/>
<input type="text" [formControl]="email"/>
<input type="text" [formControl]="title"/>
</div>
notez que nous utilisons toujours la directive [formGroup].
Cependant, pour que ce modèle soit compilé sans erreur, alors votre component doit déclarer les contrôles comme AbstractControls et non FormControls:
moncomposant.ts
firstName: AbstractControl
lastName: AbstractControl
email: AbstractControl
title: AbstractControl
cependant, veuillez noter que déclarer AbstractControls est pas recommandé, donc si vous obtenez l'erreur Cannot find control with unspecified name attribute
alors il est probable que vous avez mélangé les styles ou que vous avez déclaré vos contrôles comme AbstractControls.
[formControl]
vous pouvez utiliser les avantages de la programmation réactive parce que FormControl
possède une propriété nommée valueChanges
(je sais que ce droit maintenant, peut-être qu'il est plus que cela) qui retourne un Observable
que vous pouvez vous abonner et utiliser. (par exemple, il est très utile dans le registre des scénarios dont vous souhaitez vérifier l'entrée de l'email de ne pas répéter dès que l'utilisateur de modifier la valeur)
à Partir de l'angle de docs (https://angular.io/guide/reactive-forms):
Composant
@Component({
...
})
export class ProfileEditorComponent {
profileForm = new FormGroup({
firstName: new FormControl(''),
lastName: new FormControl(''),
});
}
Template
<form [formGroup]="profileForm">
<label>
First Name:
<input type="text" formControlName="firstName">
</label>
<label>
Last Name:
<input type="text" formControlName="lastName">
</label>
</form>
notez que tout comme le
FormGroup
contient un groupe de contrôles, l' profileFormFormGroup
est lié à l'élément de formulaire avecFormGroup
de communication entre le modèle et la formulaire contenant les entrées.formControlName
contribution fournie par leFormControlName
la directive lie chaque entrée individuelle au formulaire de contrôle définies dans leFormGroup