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.

38
demandé sur smartmouse 2016-10-21 11:33:04

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:)

66
répondu Harry Ninh 2016-10-21 08:38:22

[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
    });
}
11
répondu Günter Zöchbauer 2016-10-21 08:42:27

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.

1
répondu rmcsharry 2018-02-27 14:05:09

[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)

0
répondu Seyed Ali Roshan 2018-02-13 20:59:21

à 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' profileForm FormGroup est lié à l'élément de formulaire avec FormGroup de communication entre le modèle et la formulaire contenant les entrées. formControlName contribution fournie par le FormControlName la directive lie chaque entrée individuelle au formulaire de contrôle définies dans le FormGroup

0
répondu Chris Halcrow 2018-08-10 03:18:14