2016-08-24 147 views
19

升级到RC5后,我们开始收到此错误:ngModel不能使用与父formGroup指令注册表单控件

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

您是否导入了'FormsModule'和'ReactiveFormsModule'? –

+0

当然,他们两个 – user2363245

+0

AFAIK,唯一现有的解释是以下内容:http://blog.angular-university.io/introduction-to-angular-2-forms-template-driven-vs-model-driven/ – user2363245

回答

52

答案是正确的错误消息, 你需要指出它是独立的,因此它不会与冲突表单控件:

[ngModelOptions]="{standalone: true}" 
+0

单独意味着什么? – Jas

+1

这意味着它没有被表单模型/数据处理,所以你可以通过任何你想要的对象/模型来传递数据,因为它曾经是AngularJS 1 –

+0

我只在我的测试设置中看到这个问题。什么是完全缺失? [ngModelOptions] =“{standalone:true}”修复了测试但改变了逻辑。 ngModel是从父组件继承的,在我的例子中声明ngForm – aholbreich

6

当你写formcontrolname角2不接受。您必须编写formControlName。它是关于大写的第二个单词。

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

如果错误仍然conitnue尝试为所有对象(myObject)字段设置窗体控件。

开始 <form> </form>之间

例如:<form [formGroup]="myForm" (ngSubmit)="submitForm(myForm.value)"> set form control for all input field </form>.

2

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>

+0

我试过但不能再工作有同样的错误? –

9

扩展在@AvenirÇokaj的回答

作为一个新手,即使我没有明确的先了解该错误消息。

错误消息指出的是,在formGroup中,有一个元素在formControl中没有被计入。 (有意/无意)

如果您打算不验证此字段,但仍希望在此输入元素上使用ngModel,请添加标志以表明它是独立组件,无需验证,如上面@Avenir所述。

+2

这是一个非常简单和形式良好的解释。 – esseara

+0

错误消息应该说:“在你的formGroup中,你有一个元素没有在你的formControl中占据。”感谢您最终解释它。作为一名新手,在我读了你的评论之前,就浪费了大约45分钟的时间。 –

+0

很高兴能在这里得到一些帮助:) – saNiks