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, поэтому их импорт решил мою проблему, введите описание изображения здесь.

Другие вопросы по тегам