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

时间:2017-08-22 15:57:19

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

在创建模型驱动表单时,我收到错误: 错误: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);
    }

4 个答案:

答案 0 :(得分:6)

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

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

如果您想在没有FormControl的情况下使用formGroup,则可以改为使用FormControlDirective

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

答案 1 :(得分:1)

你可以试试这个吗

<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;
}

答案 2 :(得分:0)

首先,您必须指定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>

答案 3 :(得分:0)

如果您的FormGroup在父组件中,而Form控件在子组件中,则必须在子组件中声明viewProviders:[{提供:ControlContainer,useExisting:FormGroupDirective}]:

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

export class ChildComponent implements OnInit {
...