ngModel不能用于使用父formGroup指令注册表单控件

use*_*245 66 angular2-forms angular2-formbuilder angular

升级到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>
Run Code Online (Sandbox Code Playgroud)

看起来在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>
Run Code Online (Sandbox Code Playgroud)

Ave*_*kaj 122

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

[ngModelOptions]="{standalone: true}"
Run Code Online (Sandbox Code Playgroud)

  • 独立是什么意思? (3认同)
  • 这意味着它不由表单模型/数据处理,因此您可以通过任何您想要的对象/模型传递数据,就像它曾经在 AngularJS 1 中一样 (2认同)
  • “在Angular v6中已弃用对ngModel输入属性和ngModelChange事件与反应形式指令的支持,并将在Angular v7中删除。” [https://next.angular.io/api/forms/FormControlName#use-with -ngmodel](https://next.angular.io/api/forms/FormControlName#use-with-ngmodel) (2认同)

saN*_*iks 22

扩展@AvenirÇokaj的答案

作为一个新手,即使我一开始并没有清楚地理解错误信息.

错误消息指示的是,在formGroup中,您有一个元素在formControl中没有被考虑.(有意/不留神)

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

  • 如果您想使用if进行验证并同时将其与ngModel一起使用该怎么办? (6认同)

use*_*245 10

好的,终于搞定了:请参阅https://github.com/angular/angular/pull/10314#issuecomment-242218563

简单地说,你可以不再使用name中的属性formGroup,并且必须使用formControlName替代


Mez*_*tli 9

当您的表单组标记中有一些没有 formControlName 属性的表单控件(如输入、选择等)时,会出现此错误。

这些示例会引发错误:

<form [formGroup]="myform">
    <input type="text">
    <input type="text" [ngmodel]="nameProperty">
    <input type="text" [formGroup]="myform" [name]="name">
</fom>
Run Code Online (Sandbox Code Playgroud)

有两种方法,独立的:

<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>
Run Code Online (Sandbox Code Playgroud)

或者将其包含到表单组中

<form [formGroup]="myform">
    <input type="text" formControlName="field1">
    <input type="text" formControlName="nameProperty">
    <input type="text" formControlName="name">
</fom>
Run Code Online (Sandbox Code Playgroud)

最后一个意味着在初始化 formGroup 中定义它们

this.myForm =  new FormGroup({
    field1: new FormControl(''),
    nameProperty: new FormControl(''),
    name: new FormControl('')
});
Run Code Online (Sandbox Code Playgroud)


eth*_*lan 8

当你写formcontrolname时 Angular 2不接受.你必须写formControlName.它是关于大写的第二个单词.

<input type="number" [(ngModel)]="myObject.name" formcontrolname="nameFormControl"/>
Run Code Online (Sandbox Code Playgroud)

如果错误仍然存​​在,请尝试为所有对象(myObject)字段设置表单控件.

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


bar*_*acı 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]))
    });
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)