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>
angular
angular2-forms
angular2-formbuilder
user2363245
źródło
źródło
FormsModule
iReactiveFormsModule
?Odpowiedzi:
Odpowiedź jest poprawna w komunikacie o błędzie, musisz wskazać, że jest samodzielny i dlatego nie powoduje konfliktu z kontrolkami formularza:
źródło
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-ngmodelRozszerzenie 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.
źródło
OK, wreszcie działało: zobacz https://github.com/angular/angular/pull/10314#issuecomment-242218563
Krótko mówiąc, nie możesz już używać
name
atrybutu w aformGroup
i musisz goformControlName
zamiast tego używaćźródło
kiedy piszesz formcontrolname, Angular 2 nie akceptuje. Musisz napisać formControlName . chodzi o drugie wielkie litery.
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>.
źródło
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>
źródło
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.
źródło
Właśnie ten błąd, bo nie ująć wszystkie moje kontrole formie w obrębie
div
zformGroup
atrybutu.Na przykład spowoduje to błąd
Można to łatwo przeoczyć, jeśli jest to szczególnie długa forma.
źródło
Jeśli chcesz używać
[formGroup]
withformControlName
, musisz zamienićname
atrybut naformControlNameformControlName
.Przykład:
To nie działa, ponieważ używa atrybutu
[formGroup]
iname
.Powinieneś zamienić
name
atrybut naformControlName
i będzie działał dobrze w następujący sposób:źródło
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
źródło
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:
Istnieją dwa sposoby, samodzielne:
Lub dołączając go do formgroup
Ostatnia z nich zakłada zdefiniowanie ich w inicjalizacji formGroup
źródło