199 votes

Désactiver les champs de saisie dans les formulaires réactifs

J'ai déjà essayé de suivre l'exemple d'autres réponses d'ici et je n'ai pas réussi !

J'ai créé un formulaire réactif (c'est-à-dire dynamique) et je veux désactiver certains champs à tout moment. Le code de mon formulaire :

this.form = this._fb.group({
  name: ['', Validators.required],
  options: this._fb.array([])
});

const control = <FormArray>this.form.controls['options'];
control.push(this._fb.group({
  value: ['']
}));

mon html :

<div class='row' formArrayName="options">
  <div *ngFor="let opt of form.controls.options.controls; let i=index">
    <div [formGroupName]="i">
      <select formArrayName="value">
        <option></option>
        <option>{{ opt.controls.value }}</option>
      </select>
    </div>
  </div>
</div>

J'ai réduit le code pour le faciliter. Je veux désactiver le champ de type select. J'ai essayé de faire ce qui suit :

form = new FormGroup({
  first: new FormControl({value: '', disabled: true}, Validators.required),
});

ne fonctionne pas ! Quelqu'un a-t-il une suggestion ?

0 votes

Comment la sélection peut-elle être désactivée, alors que vous essayez de désactiver un formcontrol appelé first ?` :)

0 votes

C'était juste une erreur de frappe. Je veux désactiver la sélection. Pouvez-vous m'aider ?

0 votes

Pouvez-vous reproduire un plunker ?

396voto

Joche Wis Points 889
name: [{value: '', disabled: true}, Validators.required],
name: [{value: '', disabled: this.isDisabled}, Validators.required],

ou

this.form.controls['name'].disable();

0 votes

Si je fixe une valeur comme ça -> pays : [ { valeur : this.address.country, disabled : true } ] la valeur ne se remplit pas.

0 votes

J'ai utilisé la même technique pour désactiver les champs qui étaient remplis automatiquement à partir de sources fiables. J'ai un interrupteur pour activer/désactiver le formulaire, et après avoir activé l'ensemble du formulaire, je désactive généralement ces champs à l'aide de la commande if déclarations. Après la soumission du formulaire, le formulaire entier est à nouveau désactivé.

1 votes

Comme l'a dit @retr0, il faut généralement les activer juste avant de consommer le formulaire entier pour, par exemple, soumettre les données au back-end, de sorte qu'il n'y a aucune chance que l'utilisateur puisse saisir des données entre le moment où vous les activez et le moment où vous envoyez les données hors du composant.

122voto

Dmitry Grinko Points 1900

Soyez attentif

Si vous créez un formulaire en utilisant une variable pour la condition et que vous essayez de la modifier ultérieurement, cela ne fonctionnera pas. le formulaire ne changera pas .

Par exemple

this.isDisabled = true;

this.cardForm = this.fb.group({
    number: [{value: null, disabled: this.isDisabled},
});

et si vous changez la variable

this.isDisabled = false;

le formulaire ne sera pas modifié. Vous devez utiliser

this.cardForm.get('number').disable() ;

BTW.

Vous devez utiliser la méthode patchValue pour modifier la valeur :

this.cardForm.patchValue({
    number: '1703'
});

1 votes

J'ai rencontré le même problème, savez-vous pourquoi cela ne fonctionne pas avec la variable ?

0 votes

@HarshadVekariya parce que vous ne passez pas de variable mais juste sa valeur qui est évaluée juste à l'intérieur du constructeur d'abstractControl...

0 votes

Merci. J'ai essayé de trouver de la documentation à ce sujet mais je n'ai pas réussi, où est-il dit que nous devons le passer dans ce formulaire ? {valeur : null, désactivé : this.isDisabled}

33voto

Volodymyr Khmil Points 203

C'est une mauvaise pratique d'utiliser disable dans un DOM avec des formulaires réactifs. Vous pouvez définir cette option dans votre FormControl lorsque vous lancez le programme de

username: new FormControl(
  {
    value: this.modelUser.Email,
    disabled: true
  },
  [
    Validators.required,
    Validators.minLength(3),
    Validators.maxLength(99)
  ]
);

Propriété value n'est pas nécessaire

Ou vous pouvez obtenir votre contrôle de formulaire avec get('control_name') et mettre disable

this.userForm.get('username').disable();

2 votes

Pourquoi est-ce une mauvaise pratique d'utiliser la désactivation dans le DOM avec les formulaires réactifs ?

3 votes

Vous recevrez un avertissement d'Angular. It looks like you’re using the disabled attribute with a reactive form directive. If you set disabled to true when you set up this control in your component class, the disabled attribute will actually be set in the DOM for you. We recommend using this approach to avoid ‘changed after checked’ errors . Il est donc recommandé de modifier l'état d'activation/désactivation directement via les contrôles. Vous pouvez également consulter cet excellent article netbasal.com/

11voto

Herbi Shtini Points 1035

Une approche plus générale serait.

// Variable/Flag declare
public formDisabled = false;

// Form init
this.form = new FormGroup({
  name: new FormControl({value: '', disabled: this.formDisabled}, 
    Validators.required),
 });

// Enable/disable form control
public toggleFormState() {
    this.formDisabled = !this.formDisabled;
    const state = this.formDisabled ? 'disable' : 'enable';

    Object.keys(this.form.controls).forEach((controlName) => {
        this.form.controls[controlName][state](); // disables/enables each form control based on 'this.formDisabled'
    });
}

4voto

Foram Jhaveri Points 21

Cela a marché pour moi : this.form.get('first').disable({onlySelf: true});

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