ngModel нельзя использовать для регистрации элементов управления формы с помощью родительской директивы formGroup.
После обновления до RC5 мы начали получать эту ошибку:
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>
Похоже, что в RC5 эти два больше нельзя использовать вместе, но я не мог найти альтернативное решение.
Вот компонент, создающий исключение:
<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>
12 ответов
Ответ на сообщение об ошибке правильный, вам нужно указать, что оно автономно и, следовательно, не конфликтует с элементами управления формы:
[ngModelOptions]="{standalone: true}"
Расширяя ответ @Avenir Çokaj
Будучи новичком, даже сначала я не понял сообщения об ошибке.
Сообщение об ошибке указывает на то, что в вашей formGroup есть элемент, который не учитывается в вашем formControl. (Преднамеренно / Нечаянно)
Если вы намерены не проверять это поле, но по-прежнему хотите использовать ngModel для этого элемента ввода, добавьте флаг, чтобы указать, что это автономный компонент без проверки, как упомянуто @Avenir выше.
Хорошо, наконец-то все заработало: см. https://github.com/angular/angular/pull/10314
Короче говоря, вы больше не можете использовать name
атрибут в formGroup
и должен использовать formControlName
вместо
Эта ошибка возникает, когда у вас есть некоторые элементы управления формой (например, Inputs, Selects и т. Д.) В тегах группы форм без свойства formControlName.
Эти примеры вызывают ошибку:
<form [formGroup]="myform">
<input type="text">
<input type="text" [ngmodel]="nameProperty">
<input type="text" [formGroup]="myform" [name]="name">
</fom>
Есть два способа, автономный:
<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>
Или включить его в группу форм
<form [formGroup]="myform">
<input type="text" formControlName="field1">
<input type="text" formControlName="nameProperty">
<input type="text" formControlName="name">
</fom>
Последний подразумевает их определение в форме инициализации Group
this.myForm = new FormGroup({
field1: new FormControl(''),
nameProperty: new FormControl(''),
name: new FormControl('')
});
При написании формы controlname Angular 2 не принимается. Вы должны написать formControlName. речь идет о прописных вторых словах.
<input type="number" [(ngModel)]="myObject.name" formcontrolname="nameFormControl"/>
если ошибка не исчезла, попробуйте установить элемент управления формы для всего поля объекта (myObject).
между началом <form> </form>
например: <form [formGroup]="myForm" (ngSubmit)="submitForm(myForm.value)"> set form control for all input field </form>.
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>
Если вы хотите использовать [formGroup] с formControlName, вы должны заменить name
приписывать formControlNameformControlName
,
Пример:
Это не работает, потому что, это использовать [formGroup]
а также name
attribut
<div [formGroup]="myGroup">
<input name="firstName" [(ngModel)]="firstName">
</div>
ты должен заменить name
приписывать formControlNameformControlName
и это будет нормально работать следующим образом:
<div [formGroup]="myGroup">
<input formControlName="firstName" [(ngModel)]="firstName">
</div>
Я только что получил эту ошибку, потому что я не заключил все свои элементы управления формой в div
с formGroup
приписывать.
Например, это выдаст ошибку
<div [formGroup]='formGroup'>
</div>
<input formControlName='userName' />
Это может быть довольно легко пропустить, если это особенно длинная форма.
Если компонент имеет более 1 формы, зарегистрируйте все элементы управления и формы
Мне нужно было знать, почему это происходит в определенном компоненте, а не в любом другом компоненте.
Проблема заключалась в том, что у меня было 2 формы в одном компоненте, а вторая форма еще не имела [formGroup]
и еще не был зарегистрирован, так как я все еще строил формы.
Я продолжил и завершил написание обеих форм, не оставляя незарегистрированных данных, которые решают проблему.
если вам действительно нужен ngModal внутри реактивной формы[ngModelOptions]="{ standalone: true }"
решу это
Похоже, вы используете ngModel в том же поле формы, что и formControlName. Поддержка использования свойства input ngModel и события ngModelChange с директивами реактивной формы устарела в Angular v6 и будет удалена в Angular v7.
В моем случае я не импортировал NgForOF и MatOptionModule, поэтому их импорт решил мою проблему, введите описание изображения здесь.