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

在创建模型驱动表单时,我收到一个错误:错误:formControlName 必须与父 formGroup 指令一起使用。您需要添加一个 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);
    }

【问题讨论】:

标签: angular angular2-template angular2-forms angular2-directives


【解决方案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>
      

      【讨论】:

        猜你喜欢
        • 2018-10-03
        • 2018-03-09
        • 2020-04-07
        • 2019-09-28
        • 2020-01-25
        • 2021-04-17
        • 1970-01-01
        • 2017-09-04
        • 2020-02-06
        相关资源
        最近更新 更多