58 votes

Angular 6 mise en garde pour l'utilisation de formControlName et ngModel

J'ai récemment mis à niveau la version d'Angular en 6-rc. J'ai reçu l'avertissement suivant

Il semblerait que vous utilisiez ngModel sur le même champ de formulaire que formControlName. Le support de l'utilisation de la propriété d'entrée ngModel et de l'événement ngModelChange avec les directives de formulaire réactif a été déprécié dans Angular v6 et sera supprimé dans Angular v7

Pour plus d'informations à ce sujet, consultez notre documentation API ici : https://angular.io/api/forms/FormControlName#use-with-ngmodel

Que dit exactement le message ? Le lien ne contient aucun fragment pour #use-with-ngmodel

J'imagine que je dois supprimer ngModel et utiliser formGroup comme objet de liaison de mes données.

0 votes

Vous devez aller à la document suivant : next.angular.io/api/forms/FormControlName#use-with-ngmodel; alors que la v6 est en version candidate, la documentation fait toujours référence à la v5.

0 votes

Curiosité: Pourquoi voulez-vous utiliser [(ngModel)] et formControlName dans la même balise d'entrée?

0 votes

J'ai commencé à utiliser ngModel à partir d'Angular 2 beta, puis j'ai ajouté formControl. Maintenant, je ne peux pas changer cela pour de nombreux formulaires.

52voto

yurzui Points 85802

Maintenant, vous pouvez trouver la documentation ici :

https://angular.io/api/forms/FormControlName#use-with-ngmodel-is-deprecated

Donc vous avez 3 options :

  1. utiliser des formulaires réactifs

  2. utiliser des formulaires pilotés par template

  3. ignorer l'avertissement (non recommandé)

    imports: [
      ReactiveFormsModule.withConfig({warnOnNgModelWithFormControl: 'never'});
    ]

45 votes

Oh mon dieu. Quel est l'intérêt de changer la syntaxe et les choses qui fonctionnent tout le temps ? J'ai passé comme une journée à passer à Angular 6 pour maintenant trouver ceci. J'ai remarqué que mes événements de sélection onchange ne se déclenchaient pas. C'était parce qu'ils ont changé la syntaxe foutue de onChange à selectionChange. Vraiment utile.

4 votes

Et il y a plus: pour les entrées courantes (texte, textarea, select, case à cocher, etc.), maintenant, Angular désactive le obligatoire à travers la configuration du Formulaire Réactif... c'est bien... vous ne pouvez pas utiliser en permanence désactivé=true. Et pire: si vous créez votre propre bibliothèque de composants d'interface utilisateur... Angular pourrait ne pas avoir de notion de ce qui est désactivé... c'est bien....

1 votes

Pour une toute nouvelle application en cours de création, laquelle des 3 alternatives ci-dessus recommanderiez-vous ?

27voto

Sohail Anwar Points 5

Supprimez [(ngModel)] de chaque champ dans formGroup contient formControlName et définissez la valeur dans la classe du contrôleur comme suit simplement ce.form.get('first').setValue('une valeur'); ne fermez pas ou ne supprimez pas les avertissements explicitement

0 votes

Oui mais j'ai écrit un morceau de code à partir de la documentation d'Angular pour une meilleure compréhension

0 votes

Merci pour l'exemple en essayant d'améliorer la lecture et la compréhension des documents

0 votes

Alors, comment obtenez-vous la valeur sans ngmodel

4voto

Ajouter

[ngModelOptions]="{standalone: true}" 

Vous pouvez en savoir plus sur le site web angular https://angular.io/api/forms/NgModel

4 votes

Je pense que beaucoup de gens sont confus par le fait qu'Angular déprecie la prise en charge de ngModel pour fonctionner avec formControlName plutôt que de déprécier complètement ngModel.

0 votes

Est-ce que cela signifie que les formulaires pilotés par modèle vont disparaître et que les gens devraient plutôt utiliser des formulaires réactifs à la place?

0voto

greenskin Points 374

Donc, je suis tombé sur cela en essayant d'afficher les avatars des utilisateurs dans mat-select:

    @{{assignedToFormGroup.controls['assignTo'].value.userName}}

    @{{user.userName}}

Dans le contrôleur, le formGroup était défini de cette manière:

public assignedToFormGroup: FormGroup;

J'ai suivi les conseils de Sohail et j'ai supprimé [(ngModel)] de mon code HTML:

    @{{assignedToFormGroup.controls['assignTo'].value.userName}}

    @{{user.userName}}

Cela m'a donné des erreurs lors de l'ouverture de la page - j'ai essayé de charger photoUrl et userName depuis null, car en enlevant [(ngModel)] j'ai aussi supprimé la sélection par défaut dans mat-select.

Alors j'ai modifié mon contrôleur pour faire ce qui suit: 1. Constructeur:

this.assignedToFormGroup.controls['assignTo'].setValue({photoUrl: '', userName: ''});
  1. Action du bouton où je sauvegarde mon formulaire - ajout de la ligne suivante:

    let assignedTo = this.assignedToFormGroup.controls['assignTo'].value;

Cela a effectivement fonctionné. Maintenant, je définis une sélection par défaut lors du chargement de la page et je lis la valeur sélectionnée lors de la soumission du formulaire. Je suis conscient que ce n'est pas la meilleure ni la plus jolie solution, mais je me suis dit que je la partagerais - cela pourrait être un bon point de départ pour une meilleure solution.

-2voto

Ahmet Arslan Points 11

Utiliser formControl (reactive Forms) est plus simple couplé avec Rxjs alors l'équipe Angular a changé son utilisation.

Changer sur le fichier html

à

[formControl]="myControl"

Changer sur le fichier ts

model: string;
  modelChanged: Subject = new Subject();

  changed(text: string) {
      this.modelChanged.next(text);
  }
  this.modelChanged.pipe(
      .subscribe(model => this.postErrorMessage = model);

à

this.myControl.valueChanges.pipe(
      .subscribe(model => this.postErrorMessage = model);

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