48 votes

Angular2 Reactive Forms formControl pour boutons radio

Je construis un formulaire en Angular avec Reactive Forms. J'utilise le FormBuilder pour créer un groupe de champs. Pour les zones de texte, cela fonctionne très bien. Mais je ne trouve pas de formControl pour les boutons radio.

Comment cela fonctionne-t-il ? Dois-je utiliser <input formControlName="gender" type="radio"> comme je le fais pour les entrées de texte ?

43voto

Chang Points 651

Dans votre composant, définissez votre bouton radio comme faisant partie de votre formulaire :

export class MyComponent {
  form: FormGroup;
  constructor(fb: FormBuilder){
    this.form = fb.group({
      gender: ""
    });
  }
}

Dans votre composant HTML, construisez votre formulaire :

<div class="form-group">
  <label>Please select your gender</label>
  <div class="row">
    <label class="md-check">
      <input type="radio" value="female" name="gender" formControlName="gender">
      Female
    </label>

    <label class="md-check">
      <input type="radio" value="male" name="gender" formControlName="gender">     
      Male
    </label>
  </div>
</div>

Je suppose que vous savez comment construire le formulaire entier avec votre bouton de soumission, qui n'est pas montré ici.

Lorsque le formulaire est soumis, vous pouvez obtenir la valeur du bouton radio ici :

let genderValue = this.form.value.gender;

Il s'agira d'une "femme" ou d'un "homme", selon le bouton radio coché.

J'espère que cela vous aidera. Je vous souhaite bonne chance !

8 votes

Je pense qu'il est pertinent de souligner que le nom et le formControlName doivent être les mêmes, comme vous l'avez fait dans votre code - pour les deux radios. C'est un point subtil qui pourrait échapper à certains.

2 votes

2 autres points utiles - (1) vous pouvez toujours inclure un événement (changement) si vous le souhaitez, bien que vous vous abonniez aux changements de toute façon, donc pas sûr que cela ait un sens. (2) comme dans votre code, vous ne devez pas lier la valeur comme vous le faites lorsque vous utilisez [(ngModel)] comme [value]="" - n'oubliez pas d'enlever le [] autour de la valeur comme @Chang le montre ici

1 votes

L'attribut name est facultatif !

42voto

peeskillet Points 32287

Dois-je faire <input formControlName="gender" type="radio"> comme je le fais pour les entrées de texte ?

Oui.

Comment cela fonctionne-t-il ?

Les directives de contrôle de formulaire utilisent un ControlValueAccessor pour communiquer avec l'élément natif. Il existe différents types de ControlValueAccessors pour chacune des entrées possibles. La bonne est choisie par le selector de la directive d'accès à la valeur. Les sélecteurs sont basés sur ce que type el <input> est. Lorsque vous avez type="radio" , l'accesseur de valeur pour les radios sera utilisé.

0 votes

J'ai essayé mais je pense que j'ai fait une erreur avant Merci de votre compréhension.

1 votes

J'ai essayé d'utiliser <input formControlName="option" type="radio" >. La valeur n'est pas liée au bouton radio mais la boîte de texte fonctionne (<input formControlName="option" type="text" >).

6voto

Cliff Points 178

J'ai remarqué une petite chose à ajouter à propos des formulaires réactifs. Si la valeur est un entier, elle doit être transformée en chaîne de caractères, sinon le bouton radio ne sera pas sélectionné.

  this.jobForm = this._fb.group({
                    id: [res["job"]["id"]],
                    job_status: [res["job"]["job_status"]**["id"].toString()**,Validators.required],
                    title: [res["job"]["title"],Validators.required]
                });

3 votes

Vous pouvez contourner ce problème en paramétrant la valeur de l'entrée à l'aide de [], comme suit [valeur]="0" au lieu de value="0" .

4voto

Simon_Weaver Points 31141

Contrôles des matériaux angulaires sont (pour la plupart) suffisamment mûrs pour être utilisés aujourd'hui.

Leurs exemples utilisent principalement ngModel, mais voici comment vous pouvez le faire avec formControlName.

<mat-radio-group formControlName="colorFilter" fxLayout="column" fxLayoutGap=".25rem">
    <mat-radio-button [value]="'Blue'">Blue things</mat-radio-button>
    <mat-radio-button [value]="'Red'">Red things</mat-radio-button>
    <mat-radio-button [value]="'Orange'">Orange things</mat-radio-button>
</mat-radio-group>

J'utilise angular/flex-layout pour placer mes boutons dans une colonne verticale.

(On aurait également pu faire value='Blue' pour une constante ou [value]="blueColorName" pour faire référence à une propriété du modèle.

Je crois qu'il y a un problème avec 0 car ce n'est pas une valeur "vraie", donc attention si vous vous liez à des enums (ce n'est peut-être plus un problème).

0voto

ngCourse Points 654
  <form [formGroup]="form" >
    <div class="row" style="margin-left: 20px; margin-bottom: 13px;">
      <label class="colmn radio" style="font-size: 17px;text-transform: capitalize;">
        <input type="radio" value="false" name="filter" formControlName="filter">
            Daily
        <span class="checkmark"></span>
      </label>

      <label class="colmn radio" style="font-size: 17px;text-transform: capitalize;margin-left: 56px">
        <input type="radio" value="true" name="filter" [checked]="true" formControlName="filter">     
            Monthly
        <span class="checkmark"></span>
      </label>

    </div>
  </form>

  form: FormGroup;

  constructor(    private _fb: FormBuilder,
   ) {

    this.form = _fb.group({
      filter: false
    });

    this.__filterChangeSubscription =  this.form.get('filter').valueChanges.subscribe(
      filterValue => {
        console.log(filterValue)
      }
    )
  }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X