ngModel non può essere utilizzato per registrare i controlli del modulo con una direttiva formGroup padre


94

Dopo l'aggiornamento a RC5 abbiamo iniziato a ricevere questo errore:

ngModel cannot be used to register form controls with a parent formGroup 
 directive.
Try using formGroup's partner directive "formControlName" instead.  Example:

    <div [formGroup]="myGroup">
      <input formControlName="firstName">
    </div>

    In your class:

    this.myGroup = new FormGroup({
       firstName: new FormControl()
    });

      Or, if you'd like to avoid registering this form control,
 indicate that it's standalone in ngModelOptions:

      Example:

      
  <div [formGroup]="myGroup">
     <input formControlName="firstName">
     <input [(ngModel)]="showMoreControls" [ngModelOptions]="{standalone: true}">
  </div>

Sembra che in RC5 i due non possano più essere usati insieme, ma non sono riuscito a trovare una soluzione alternativa.

Ecco il componente che produce l'eccezione:

    <select class="field form-control" [formGroup]="form" [(ngModel)]="cause.id" [name]="name">
    <option *ngFor="let c of causes" [value]="c.text">{{c.text}}</option>
    </select>

Hai importato FormsModulee ReactiveFormsModule?
Günter Zöchbauer

Certo, entrambi
utente2363245

Per quanto ne so, l'unica spiegazione esistente è la seguente: blog.angular-university.io/…
user2363245

Fonte della modifica trovata: github.com/angular/angular/pull/10314
user2363245

Risposte:


178

La risposta è giusta sul messaggio di errore, è necessario indicare che è autonomo e quindi non è in conflitto con i controlli del modulo:

[ngModelOptions]="{standalone: true}"

1
cosa significa standalone?
Jas

2
Significa che non è gestito dal modello / dati del modulo, quindi puoi passare i dati da qualsiasi oggetto / modello che desideri come una volta in AngularJS 1
Avenir Çokaj

Vedo questo problema solo nella mia configurazione di prova. Cosa manca esattamente? [ngModelOptions] = "{standalone: ​​true}" corregge il test ma cambia la logica. ngModel è ereditato dal componente genitore, che nel mio caso dichiara ngForm
aholbreich

2
Support for using the ngModel input property and ngModelChange event with reactive form directives has been deprecated in Angular v6 and will be removed in Angular v7. https://next.angular.io/api/forms/FormControlName#use-with-ngmodel
WasiF

28

Espandendo la risposta di @Avenir Çokaj

Essendo un principiante anche io all'inizio non ho capito chiaramente il messaggio di errore.

Ciò che il messaggio di errore indica è che nel tuo formGroup hai un elemento che non viene considerato nel tuo formControl. (Intenzionalmente / Accidentalmente)

Se intendi non convalidare questo campo ma desideri comunque utilizzare ngModel su questo elemento di input, aggiungi il flag per indicare che si tratta di un componente autonomo senza la necessità di convalida come menzionato da @Avenir sopra.


6
E se volessi usare se per la convalida E usarlo con ngModel allo stesso tempo?
Paul,

Nel mio caso mi sono perso a dichiarare formControl per un elemento all'interno di formGroup!
Sagar Khatri


8

quando scrivi formcontrolname Angular 2 non accetto. Devi scrivere formControlName . si tratta di seconde parole maiuscole.

<input type="number" [(ngModel)]="myObject.name" formcontrolname="nameFormControl"/>

se l'errore persiste, provare a impostare il controllo del modulo per tutto il campo oggetto (mioOggetto).

tra l'inizio <form> </form>per esempio:<form [formGroup]="myForm" (ngSubmit)="submitForm(myForm.value)"> set form control for all input field </form>.


5

import { FormControl, FormGroup, AbstractControl, FormBuilder, Validators } from '@angular/forms';


    this.userInfoForm = new FormGroup({
      userInfoUserName: new FormControl({ value: '' }, Validators.compose([Validators.required])),
      userInfoName: new FormControl({ value: '' }, Validators.compose([Validators.required])),
      userInfoSurName: new FormControl({ value: '' }, Validators.compose([Validators.required]))
    });
<form [formGroup]="userInfoForm" class="form-horizontal">
            <div class="form-group">
                <label class="control-label"><i>*</i> User Name</label>
                    <input type="text" formControlName="userInfoUserName" class="form-control" [(ngModel)]="userInfo.userName">
            </div>
            <div class="form-group">
                <label class="control-label"><i>*</i> Name</label>
                    <input type="text" formControlName="userInfoName" class="form-control" [(ngModel)]="userInfo.name">
            </div>
            <div class="form-group">
                <label class="control-label"><i>*</i> Surname</label>
                    <input type="text" formControlName="userInfoSurName" class="form-control" [(ngModel)]="userInfo.surName">
            </div>
</form>


1

Se il componente ha più di un modulo, registrare tutti i controlli e i moduli

Avevo bisogno di sapere perché questo stava accadendo in un determinato componente e non in qualsiasi altro componente.

Il problema era che avevo 2 moduli in un componente e il secondo modulo non aveva ancora [formGroup]e non era ancora registrato poiché stavo ancora costruendo i moduli.

Sono andato avanti e ho completato la scrittura di entrambi i moduli senza lasciare un input non registrato che risolvesse il problema.


1

Ho appena ricevuto questo errore perché non ho racchiuso tutti i controlli del modulo all'interno divdi un formGroupattributo.

Ad esempio, questo genererà un errore

<div [formGroup]='formGroup'>
</div>
<input formControlName='userName' />

Questo può essere abbastanza facile da perdere se è una forma particolarmente lunga.


0

Se vuoi usare [formGroup]con formControlName, devi sostituire l' nameattributo con formControlNameformControlName.

Esempio:

Questo non funziona perché utilizza l' attributo [formGroup]e name.

<div [formGroup]="myGroup">
   <input name="firstName" [(ngModel)]="firstName">
</div>

Dovresti sostituire l' nameattributo con formControlNamee funzionerà correttamente in questo modo:

<div [formGroup]="myGroup">
   <input formControlName="firstName" [(ngModel)]="firstName">
</div>

una soluzione per questo potrebbe anche essere se stai usando un [formGroup] = "myGroup" e fai riferimento internamente a [(ngModel)] una proprietà che non è presente nel formGroup. prova ad aggiungere [ngModelOptions] = "{standalone: ​​true}" in modo da dire al tuo compilatore che potrebbe essere escluso ed è una proprietà autonoma
stante ProblemAnswerQue

0

Sembra che tu stia utilizzando ngModel nello stesso campo modulo di formControlName. Il supporto per l'utilizzo della proprietà di input ngModel e dell'evento ngModelChange con le direttive del modulo reattivo è stato deprecato in Angular v6 e verrà rimosso in Angular v7


0

Questo errore viene visualizzato quando sono presenti alcuni controlli del modulo (come Inputs, Selects, ecc.) Nei tag del gruppo del modulo senza proprietà formControlName.

Questi esempi generano l'errore:

<form [formGroup]="myform">
    <input type="text">
    <input type="text" [ngmodel]="nameProperty">
    <input type="text" [formGroup]="myform" [name]="name">
</fom>

Ci sono due modi, lo stand alone:

<form [formGroup]="myform">
    <input type="text" [ngModelOptions]="{standalone: true}">
    <input type="text" [ngmodel]="nameProperty" [ngModelOptions]="{standalone: true}">
    <!-- input type="text" [formGroup]="myform" [name]="name" --> <!-- no works with standalone --
</form>

O includendolo nel formgroup

<form [formGroup]="myform">
    <input type="text" formControlName="field1">
    <input type="text" formControlName="nameProperty">
    <input type="text" formControlName="name">
</fom>

L'ultimo implica definirli nel form di inizializzazione Group

this.myForm =  new FormGroup({
    field1: new FormControl(''),
    nameProperty: new FormControl(''),
    name: new FormControl('')
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.