formControlName 必须与父 formGroup 指令一起使用

Posted

技术标签:

【中文标题】formControlName 必须与父 formGroup 指令一起使用【英文标题】:formControlName must be used with a parent formGroup directive 【发布时间】:2018-01-31 00:19:24 【问题描述】:

在创建模型驱动表单时,我收到一个错误:错误:。您需要添加一个 formGroup 指令并将一个现有的 FormGroup 实例传递给它(你可以在你的类中创建一个)。

请告诉我这段代码出了什么问题。

app.component.html

<div class="col-md-6">
  <form  (ngSubmit)="saveSession(newSessionForm.value)" autocomplete="off">
    <div class="form-group">
      <label for="sessionName">Session Name:</label>
      <input formControlName="name" id="sessionName" type="text" class="form-control" placeholder="session name..." />
    </div>
    <div class="form-group">
      <label for="abstract">Abstract:</label>
      <textarea formControlName="abstract" id="abstract" rows=3 class="form-control" placeholder="abstract..."></textarea>
    </div>
    <button type="submit" class="btn btn-primary">Save</button>
  </form>
</div>

app.component.ts

export class CreateSession 

    newSessionForm:FormGroup;
    abstract : FormControl;
    name : FormControl;

    ngOInInit()
        this.name = new FormControl('', Validators.required)
        this.abstract = new FormControl('', Validators.required)

        this.newSessionForm = new FormGroup(
            name:this.name,
            abstract: this.abstract
        )         
    


    saveSession(formValues)
        console.log(formValues);
    

【问题讨论】:

这里解决了! ***.com/questions/43305975/… 【参考方案1】:

Angular 正在等待任何父元素上的FormGroupDirective。所以:

<form [formGroup]="newSessionForm" ...
  <input formControlName="name"
  ...
  <input formControlName="abstract"

如果您想使用 FormControl 而不使用 formGroup,您可以改用 FormControlDirective

<input [formControl]="name"
...
<input [formControl]="abstract"

【讨论】:

如何在 typescript 中访问这个值?【参考方案2】:

如果您的 FormGroup 在父组件中,而 Form 控件在子组件中,则必须在子组件中声明 viewProviders: [ provide: ControlContainer, useExisting: FormGroupDirective ],如下所示:

@Component(
  selector: 'child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.css'],
  viewProviders: [ provide: ControlContainer, useExisting: FormGroupDirective ]
)

export class ChildComponent implements OnInit 
...

【讨论】:

【参考方案3】:

你可以试试这个方法

<div class="col-md-12" formArrayName="educations">
</div>

ts文件代码

educations: this.formBuilder.array([]),

或者

<form [formGroup]="manageOrderForm">

</form>

ts文件代码

import  Router  from '@angular/router';

@Component(
  selector: 'app-order',
  templateUrl: './order.component.html',
  styleUrls: ['./order.component.css']
)
export class OrderComponent implements OnInit 

  manageOrderForm: any;

【讨论】:

【参考方案4】:

首先,您必须指定 formGroup ,它将驱动与输入绑定的表单控件。

<form [formGroup]="newSessionForm" (ngSubmit)="saveSession(newSessionForm.value)" autocomplete="off">
<div class="form-group">
  <label for="sessionName">Session Name:</label>
  <input formControlName="name" id="sessionName" type="text" class="form-control" placeholder="session name..." />
</div>
<div class="form-group">
  <label for="abstract">Abstract:</label>
  <textarea formControlName="abstract" id="abstract" rows=3 class="form-control" placeholder="abstract..."></textarea>
</div>
<button type="submit" class="btn btn-primary">Save</button>

【讨论】:

以上是关于formControlName 必须与父 formGroup 指令一起使用的主要内容,如果未能解决你的问题,请参考以下文章

formGroupName必须与父formGroup指令一起使用

mat-list 的 formControlName 给出 'mat-form-field 必须包含 MatFormFieldControl'

解决[disabled]="true"与formControlName冲突

以角度与 FormControlName 绑定

ngModel 在与 formControlName 相同的表单字段上

formGroup的子组件内的Angular 2 formControlName