J'utilise ReactiveFormsModule
Angular2 pour créer un composant contenant un formulaire. Voici mon code:
foo.component.ts :
constructor(fb: FormBuilder) {
this.myForm = fb.group({
'fullname': ['', Validators.required],
'gender': []
});
}
foo.component.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.component.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 l'utilisation [formControl]
et formControlName
.
angular
radio-button
angular2-forms
form-control
angular2-formbuilder
souris intelligente
la source
la source
Réponses:
Je pense que vous avez manqué un point important: la
[formGroup]
directive dans le deuxième exemple.formControlName
est utilisé avec[formGroup]
pour enregistrer votre formulaire de navigation à plusieurs points. Par exemple:Est équivalent à:
Maintenant, imaginez imbriqué
FormGroups
:)la source
[formControl]
causant un problème lors de laform.valid
validation avec formGroup, tous les commentaires[formControl]
affecte une référence à l'FormControl
instance que vous avez créée auFormControlDirective
.formControlName
affecte une chaîne au module Forms pour rechercher le contrôle par son nom.Si vous créez des variables pour les contrôles, vous n'avez pas non plus besoin du
.
comme mentionné par Harry, mais je suggérerais également de l'utiliser à la[formGroup]
place car avec des formulaires plus compliqués, cela peut devenir compliqué.la source
Il y a une 3e équivalence aux deux fournies dans la réponse acceptée, qui est la suivante (non recommandée):
Notez que nous utilisons toujours la directive [formGroup].
Cependant, pour que ce modèle se compile sans erreur, votre composant doit déclarer les contrôles comme AbstractControls et non comme FormControls:
myComponent.ts
Cependant, veuillez noter que déclarer AbstractControls n'est pas recommandé , donc si vous obtenez l'erreur,
Cannot find control with unspecified name attribute
il est probable que vous ayez mélangé les styles ou que vous ayez déclaré vos contrôles comme AbstractControls.la source
À partir de la documentation Angular ( https://angular.io/guide/reactive-forms ):
Composant
Modèle
la source
avec
[formControl]
vous pouvez utiliser les avantages de la programmation réactive carFormControl
a une propriété nomméevalueChanges
(je connais celle-ci en ce moment, peut-être qu'il y en a plus que cela) qui retourne unObservable
auquel vous pouvez vous abonner et l'utiliser. (par exemple, il est très utile dans les scénarios de registre que vous souhaitez vérifier que l'e-mail d'entrée ne soit pas répété dès que l'utilisateur change la valeur)la source