Angular 4 - 错误:formControlName必须与父formGroup指令一起使用

use*_*985 12 angular

我正在form使用组件添加输入字段 -

发动机附加接触form.html

<form (ngSubmit)="onSubmit()" [formGroup]="contact_form">
<md-tab-group>
    <md-tab label="Form">
        <ang-form></ang-form>
    </md-tab>
    <md-tab label="Email">
        <ang-email></ang-email>
    </md-tab>
    <md-tab label="Message">
        <ang-message></ang-message>
    </md-tab>
</md-tab-group>
<button md-raised-button type="submit">Publish</button>
Run Code Online (Sandbox Code Playgroud)

ANG-form.html

<div class="form-grid form-title">
     <md-input-container>
         <input formControlName="contact_form_title" 
        class="form-title-field" mdInput placeholder="Title" value="">
     </md-input-container>
</div>
Run Code Online (Sandbox Code Playgroud)

使用相同的方式我添加了其他组件(ang-email ang-message)html.

我添加了[formGroup]指令engine-add-form.ts

export class EngineAddFormComponent{

contact_form: any;

form_value: any;

constructor(){
    this.contact_form = new FormGroup({
        contact_form_title: new FormControl('', Validators.minLength(2)),
        ........
        ........
    });
}
onSubmit(){
    this.form_value = JSON.stringify(this.contact_form.value);
    console.log(this.form_value);
}
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误 -

错误:formControlName必须与父formGroup指令一起使用.您将要添加formGroup指令并将其传递给现有的FormGroup实例(您可以在类中创建一个).

我无法理解我的代码有什么问题.

Abh*_*ngh 23

您需要将formGroup(在您的情况下为contact_form)传递给ang-form的子组件

发动机附加接触form.html(修改)

<form (ngSubmit)="onSubmit()" [formGroup]="contact_form">
<md-tab-group>
    <md-tab label="Form">
        <ang-form [group]="contact_form"></ang-form>
    </md-tab>
    <md-tab label="Email">
        <ang-email></ang-email>``
    </md-tab>
    <md-tab label="Message">
        <ang-message></ang-message>
    </md-tab>
</md-tab-group>
<button md-raised-button type="submit">Publish</button>
Run Code Online (Sandbox Code Playgroud)

ANG-form.html(修改)

<div class="form-grid form-title" [formGroup]="group">
     <md-input-container>
         <input formControlName="contact_form_title" 
        class="form-title-field" mdInput placeholder="Title" value="">
     </md-input-container>
</div>
Run Code Online (Sandbox Code Playgroud)

添加@Input()组:FormGroup; 在你的ang-form.component.ts中

  • 在此过程中,它可以使表单的.submitted状态更糟,因为未在formGroup实例上触发`submit`事件。请注意,`FormGroup`和`FormGroupDirective`是不同的东西,即使您正在重用formGroup数据模型,也会创建一个新的'directive'。 (2认同)

yur*_*zui 16

这样做有很多选择.

1)这是一个使用formControl指令和角度DI系统的例子:

@Component({
  selector: 'ang-form',
  template: `
    <input [formControl]="control">
  `
})
export class AngForm {
  control: FormControl;

  constructor(private formGroupDir: FormGroupDirective) {}

  ngOnInit() {
    this.control = this.formGroupDir.control.get('contact_form_title') as FormControl;
  }
}
Run Code Online (Sandbox Code Playgroud)

Stackblitz示例

2)在子组件上定义ControlContainer视图提供程序的另一种方法:

@Component({
  selector: 'ang-form',
  template: `
     <input formControlName="contact_form_title">
    `,
  viewProviders: [{ provide: ControlContainer, useExisting: FormGroupDirective }]
})
export class AngForm { }
Run Code Online (Sandbox Code Playgroud)

Stackblitz示例

有关更多示例,请参阅

  • @Simon_Weaver也以另一种方式检查https://stackblitz.com/edit/angular-ku6lt7?file=app/ang-form.component.ts (2认同)