J'avais l'habitude d'avoir un formulaire simple sans aucune validation où le HTML ressemblait à peu près à ceci:
ERROR in src/app/new-to-do-dialog/new-to-do-dialog.component.ts(31,9): error TS2322: Type 'AbstractControl' is not assignable to type 'string'. src/app/new-to-do-dialog/new-to-do-dialog.component.ts(32,9): error TS2322: Type 'AbstractControl' is not assignable to type 'DateConstructor'. Property 'prototype' is missing in type 'AbstractControl'. src/app/new-to-do-dialog/new-to-do-dialog.component.ts(33,9): error TS2322: Type 'AbstractControl' is not assignable to type 'string'.
J'ai ensuite déplacé mon formulaire vers des formulaires réactifs et reçu l'avertissement que je ne pouvais pas avoir ngModel dans le même champ que formControlname. J'ai du mal à attribuer les données du formulaire au champ de saisie du service.
Section actuelle de HTMl:
saveToDo() { this.dialogRef.close(); this.todoListService.toDoData.taskName = this.todoForm.get('taskName'); this.todoListService.toDoData.dueDate = this.todoForm.get('dueDate'); this.todoListService.toDoData.extraNote = this.todoForm.get('extraNote'); this.todoListService.addToDo(); }
Donc je supprimé la ligne ngModel et ajouté ceci à mon TS:
<form [formGroup]="todoForm"> <mat-form-field> <input matInput placeholder="TaskName" formControlName="taskName" required [(ngModel)]="todoListService.toDoData.taskName" > </mat-form-field>
Les erreurs que j'obtiens sont:
<mat-form-field> <input matInput type="text" placeholder="TaskName" [(ngModel)]="todoListService.toDoData.taskName" formControlName="taskName" required required> [(ngModel)]="todoListService.toDoData.taskName" > </mat-form-field>
Apparemment, j'ai mal compris quelque chose concernant l'accès aux données à partir du formulaire.
J'ai suivi ce guide et cet exemple:
https://angular.io/api/forms/FormControlName#use-with-ngmodel https://stackblitz.com/edit/example-angular-material-reactive- formulaire
Merci pour toute aide!
3 Réponses :
Ici this.todoForm.get ('controlname')
retourne l'objet AbstractControl alors accédez à la valeur de l'objet comme ci-dessous
saveToDo() { this.dialogRef.close(); this.todoListService.toDoData.taskName = this.todoForm.get('taskName').value; this.todoListService.toDoData.dueDate = this.todoForm.get('dueDate').value; this.todoListService.toDoData.extraNote = this.todoForm.get('extraNote').value; this.todoListService.addToDo(); }
J'espère que cela vous aidera!
vous pouvez également utiliser this.todoForm.value, ou this.todoForm.controls.tasjName.value, par exemple: this.todo.ListService, toDoData = this.todoForm.value
À partir d'Angular 7, vous ne pouvez pas utiliser à la fois formControlName et ngModel. Si vous souhaitez utiliser des formulaires basés sur des modèles , vous pouvez utiliser ngModel et si vous souhaitez utiliser des formulaires réactifs , vous ne pouvez pas utiliser ngModel. (Simple)
COMME vous avez décidé de suivre l'approche des formulaires réactifs :
selectedCode: string = ""; onChangeCode(code: string) { this.selectedCode = code; }
<input type="text" (change)="onChangeCode($event.target.value)" formControlName="code" id="txtCode">
supprimer [(ngModel)] du fichier html.
puis ajouter ce qui suit à votre fichier ts
this.todoForm.patchValue({ taskName: this.todoListService.toDoData.taskName });
Je pense que la propriété de nom devrait être supprimée si vous utilisez un formulaire réactif
Idem avec (NgModel) et la directive requise. Ils doivent être déclarés au format formGroup