148 votes

Formulaires réactifs - attribut désactivé

J'essaie d'utiliser le disabled de l'attribut formControl . Lorsque je le mets dans le modèle, il fonctionne :

<md-input formControlName="id" placeholder="ID" [disabled]="true"></md-input>

Mais le navigateur me prévient :

Il semble que vous utilisiez l'attribut disabled avec une directive de formulaire réactive. Si vous mettez disabled à true lorsque vous configurez ce contrôle dans votre classe de composant, l'attribut disabled sera réellement défini dans le DOM pour vous. pour vous. Nous vous recommandons d'utiliser cette approche pour éviter les erreurs "changed after checked".

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

Donc je l'ai mis dans le FormControl et supprimé du modèle :

constructor(private itemsService: ItemsService) {
    this._items = [];
    this.myForm = new FormGroup({
        id: new FormControl({value: '', disabled: true}, Validators.required),
        title: new FormControl(),
        description: new FormControl()
    });
    this.id = this.myForm.controls['id'];
    this.title = this.myForm.controls['title'];
    this.description = this.myForm.controls['description'];
    this.id.patchValue(this._items.length);
}

Mais cela ne fonctionne pas (il ne s'agit pas de désactiver la fonction input ). Quel est le problème ?

1 votes

Cela semble fonctionner parfaitement avec la version actuelle d'Angular 2 : plnkr.co/edit/CQQtkYC9D5EoH0sAlNCV?p=preview

0 votes

J'utilise la dernière version du projet angular cli pour les tests.

2 votes

Vous utilisez @angular/material, donc, selon leurs problèmes github : github.com/angular/material2/issues/1171 Il n'est pas encore pris en charge et il s'agit d'une version alpha, vous ne pouvez donc pas vous attendre à ce que toutes les fonctionnalités soient disponibles.

164voto

bhantol Points 1719

J'ai utilisé [attr.disabled] parce que je continue à préférer ce modèle à l'activation/désactivation programmatique, car il est supérieur, selon moi.

Changement

<md-input formControlName="id" placeholder="ID" [disabled]="true"></md-input>

à

<md-input formControlName="id" placeholder="ID" [attr.disabled]="true"></md-input>

Si vous êtes sur un changement de matériel plus récent md-input a mat-input .

4 votes

Cela fonctionne, merci ! Mais je ne comprends pas pourquoi je dois utiliser "attr.disabled" (et pas seulement "disabled") ?

0 votes

Cela fonctionne également pour les composants Telerik Kendo for Angular. Certains d'entre eux ont [disabled] et en l'utilisant, j'ai obtenu le même avertissement de compilation. J'ai modifié [disabled] a [attr.disabled] et il est propagé dans le composant .disabled propriété.

9 votes

Il convient de noter qu'avec [attr.disabled], vous ne pouvez pas utiliser la fonction "bind" dans les deux sens. Il ne fonctionne qu'une fois. Avec [disabled] et l'avertissement dans la console fonctionne. J'utilise Angular 4.1.3.

33voto

Ajmal sha Points 1032

Pour résoudre ce problème, vous pouvez essayer comme suit .

pour la désactivation

this.myForm.controls['id'].disable();

pour permettre

this.myForm.controls['id'].enable();

Pour plus de références, consultez le problème posté sur github à ce sujet. https://github.com/angular/angular/issues/11271#issuecomment-244507976

27voto

Kaloyan Stamatov Points 185

Vous pouvez activer/désactiver un contrôle de formulaire en utilisant les méthodes suivantes :

control.disable() ou control.enable()

Si cela n'a pas fonctionné pour vous, vous pouvez utiliser une directive

import { NgControl } from '@angular/forms';

@Directive({
  selector: '[disableControl]'
})
export class DisableControlDirective {

  @Input() set disableControl( condition : boolean ) {
    const action = condition ? 'disable' : 'enable';
    this.ngControl.control[action]();
  }

  constructor( private ngControl : NgControl ) {
  }

}

Vous pourriez alors l'utiliser comme suit

<input [formControl]="formControl" [disableControl]="disable">
<button (click)="disable = true">Disable</button>
<button (click)="disable = false">Enable</button>

Cette technique est décrite ici :

https://netbasal.com/disabling-form-controls-when-working-with-reactive-forms-in-angular-549dd7b42110

J'espère que cela vous aidera

0 votes

Pouvez-vous s'il vous plaît montrer quelques extraits de code js comment faire cela ?

0 votes

Veuillez fournir des échantillons de stackb

0 votes

Voici un exemple : netbasal.com/

20voto

BBaysinger Points 1613

J'ai constaté que je devais avoir une valeur par défaut, même s'il s'agissait d'une chaîne vide. Donc, ceci :

this.registerForm('someName', {
  firstName: new FormControl({disabled: true}),
});

...devait devenir ça :

this.registerForm('someName', {
  firstName: new FormControl({value: '', disabled: true}),
});

Voir ma question (qui, à mon avis, n'est pas un doublon) : Passer 'disabled' dans l'objet form state au constructeur de FormControl ne fonctionne pas

0 votes

Cela ne fonctionne pas pour le contrôle de formulaire mat-select. Savez-vous pourquoi ?

0voto

Utilisez [attr.disabled] au lieu de [disabled], dans mon cas, cela fonctionne bien.

3 votes

Bien que cela soit possible, vous ne devez pas utiliser une solution basée sur des modèles lorsque vous travaillez avec des formulaires réactifs. Le problème du mélange des deux est que l'on ne peut plus faire confiance à l'état du formulaire réactif.

0 votes

Il est désactivé mais si je mets cette option à false, le contrôle est également désactivé.

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