ngModel nie może służyć do rejestrowania formantów formularzy z nadrzędną dyrektywą formGroup

89

Po aktualizacji do RC5 zaczęliśmy otrzymywać ten błąd:

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>

Wygląda na to, że w RC5 tych dwóch nie można już używać razem, ale nie mogłem znaleźć alternatywnego rozwiązania.

Oto komponent powodujący wyjątek:

    <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>
user2363245
źródło
Czy zaimportowałeś FormsModulei ReactiveFormsModule?
Günter Zöchbauer
Jasne, obaj
user2363245
AFAIK, jedyne istniejące wyjaśnienie jest następujące: blog.angular-university.io/…
user2363245
Znalezione źródło zmiany: github.com/angular/angular/pull/10314
user2363245

Odpowiedzi:

171

Odpowiedź jest poprawna w komunikacie o błędzie, musisz wskazać, że jest samodzielny i dlatego nie powoduje konfliktu z kontrolkami formularza:

[ngModelOptions]="{standalone: true}"
Avenir Çokaj
źródło
1
co to znaczy standalone?
Jas,
2
Oznacza to, że nie jest obsługiwany przez model / dane formularza, więc możesz przekazywać dane przez dowolny obiekt / model, tak jak to było w AngularJS 1
Avenir Çokaj
Widzę ten problem tylko w mojej konfiguracji testowej. Czego dokładnie brakuje? [ngModelOptions] = "{standalone: ​​true}" naprawia test, ale zmienia logikę. ngModel jest dziedziczony po komponencie nadrzędnym, który deklaruje ngForm w moim przypadku
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
27

Rozszerzenie odpowiedzi @Avenir Çokaj

Będąc nowicjuszem, nawet ja na początku nie zrozumiałem jasno komunikatu o błędzie.

Komunikat o błędzie wskazuje, że w formGroup masz element, który nie jest uwzględniany w formControl. (Celowo / przypadkowo)

Jeśli nie zamierzasz sprawdzać poprawności tego pola, ale nadal chcesz używać ngModel w tym elemencie wejściowym, dodaj flagę, aby wskazać, że jest to samodzielny komponent bez potrzeby walidacji, jak wspomniano powyżej w @Avenir.

saNiks
źródło
6
A co jeśli chcesz użyć if do walidacji ORAZ używać go z ngModel w tym samym czasie?
Paul
W moim przypadku nie udało mi się zadeklarować formControl dla elementu wewnątrz formGroup!
Sagar Khatri
8

kiedy piszesz formcontrolname, Angular 2 nie akceptuje. Musisz napisać formControlName . chodzi o drugie wielkie litery.

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

jeśli błąd nadal występuje, spróbuj ustawić kontrolę formularza dla całego pola obiektu (myObject).

<form> </form>na przykład między startem :<form [formGroup]="myForm" (ngSubmit)="submitForm(myForm.value)"> set form control for all input field </form>.

ethemsulan
źródło
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>

barış çıracı
źródło
1

Jeśli komponent ma więcej niż 1 formularz, zarejestruj wszystkie kontrolki i formularze

Musiałem wiedzieć, dlaczego tak się dzieje w pewnym elemencie, a nie w żadnym innym.

Problem polegał na tym, że miałem 2 formularze w jednym komponencie, a drugi formularz jeszcze nie miał [formGroup]i nie był jeszcze zarejestrowany, ponieważ nadal tworzyłem formularze.

Poszedłem dalej i wypełniłem oba formularze kompletne bez pozostawiania niezarejestrowanych danych wejściowych, które rozwiązują problem.

GoalsAndGambles
źródło
1

Właśnie ten błąd, bo nie ująć wszystkie moje kontrole formie w obrębie divz formGroupatrybutu.

Na przykład spowoduje to błąd

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

Można to łatwo przeoczyć, jeśli jest to szczególnie długa forma.

Stephen Paul
źródło
1

Jeśli chcesz używać [formGroup]with formControlName, musisz zamienić nameatrybut na formControlNameformControlName.

Przykład:

To nie działa, ponieważ używa atrybutu [formGroup]i name.

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

Powinieneś zamienić nameatrybut na formControlNamei będzie działał dobrze w następujący sposób:

<div [formGroup]="myGroup">
   <input formControlName="firstName" [(ngModel)]="firstName">
</div>
SANA Abdoul Aziz
źródło
rozwiązaniem tego może być również użycie [formGroup] = "myGroup" i wewnętrzne odwołanie do właściwości [(ngModel)], która nie znajduje się w formGroup. spróbuj dodać [ngModelOptions] = "{standalone: ​​true}", aby poinformować kompilator, że może zostać wykluczony i jest to własność samodzielna
ProblemAnswerQue
0

Wygląda na to, że używasz ngModel w tym samym polu formularza co formControlName. Obsługa używania właściwości wejściowej ngModel i zdarzenia ngModelChange z dyrektywami formularza reaktywnego została przestarzała w Angular v6 i zostanie usunięta w Angular v7

Qodir Amirov
źródło
0

Ten błąd pojawia się, gdy masz jakieś kontrolki formularza (takie jak dane wejściowe, zaznaczenia itp.) W tagach grupy formularzy bez właściwości formControlName.

Te przykłady zgłaszają błąd:

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

Istnieją dwa sposoby, samodzielne:

<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>

Lub dołączając go do formgroup

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

Ostatnia z nich zakłada zdefiniowanie ich w inicjalizacji formGroup

this.myForm =  new FormGroup({
    field1: new FormControl(''),
    nameProperty: new FormControl(''),
    name: new FormControl('')
});
Meztli
źródło