将表单传递给子组件并验证子组件中的表单

时间:2019-09-25 00:18:27

标签: angular

我在父组件中有一个提交按钮。我也有几个子组件。现在,我想启用该按钮,以在验证通过后将表单的所有值保存在所有子组件中。  在父组件中,我创建了表单组。

for (int count = 0; count < values.length; count++) {
    bubbleSort(values);
    System.out.println("count = " + count);
}

在父组件的构造函数中,

 public mainForm: FormGroup;

在父html中,我们将表单传递给子。

      constructor(private fb: FormBuilder) {
       this.mainForm = this.fb.group({
       child1Form: this.fb.group({
           projectName: [null, Validators.required],
           projectSource: [null, Validators.required]
       });
      });
     }

在子组件html中,代码为:

<div>
  <app-child1 [child1Form]="mainForm.controls['child1Form']"></app-child1>
</div> 

在子组件的ts文件中,我们使用父组件的表单。

<form [formGroup]="child1Form">
   <div>
      <input [(ngModel)]="projectName" formControlName="projectName">
   </div>
   <div>
      <input [(ngModel)]="projectSource" formControlName="projectSource">
   </div>
</form>

我想要的是父组件的 @Input() child1Form: any; 中的内容,请检查表单验证。

ngOnInit

但是我的问题是,即使我更改了子组件的输入控件中的文本,代码也没有到达ngOnInit() { this.mainForm.statusChanges.subscribe(data => { const f = this.mainForm.controls['child1Form']; if(f.valid || f.dirth) // do something such as enable/disable the submit button }); } 部分。我认为当我键入某些内容时,表单的值或状态会发生变化,因此我可以进行验证。

1 个答案:

答案 0 :(得分:1)

让我们逐步解决此问题:

  1. 创建一个parentchild组件
  2. parent.component.html
  3. 中添加以下HTML模板
<form>
  <app-child></app-child>
  <button>Submit</button>
</form>
  1. child.component.html
  2. 中添加以下HTML模板
<form [formGroup]="child1Form">
  <div>
    <input type="text" formControlName="projectName" required>
  </div>
  <div>
    <input type="text" formControlName="projectSource" required>
  </div>
</form>
  1. child.component.ts 中为child1Form创建一个formGroup(我已经在'child.component.ts'中声明了'child1Form',而不是在' parent.component.ts'
  child1Form: FormGroup;

  constructor(private fb: FormBuilder) { }

  ngOnInit() {
    this.child1Form = this.fb.group({
      projectName: ['', Validators.required],
      projectSource: ['', Validators.required]
    })
  }
  1. 现在,订阅statusChanges并在 child.component.ts
  2. 中发送值
  @Output() isChild1FormValid: EventEmitter<boolean> = new EventEmitter<boolean>();

  ngOnInit() {
    this.child1Form.statusChanges.subscribe(value => {
      if(value === 'VALID') {
        this.isChild1FormValid.emit(true);
      }
    });
  }
  1. parent.component.html
  2. 中监听发射的值
<form>
  <app-child (isChild1FormValid)="enableSubmitButton($event)"></app-child>
</form>
  1. 将值保留在 parent.component.ts
  2. 中的属性中
  isChild1FormValid: boolean;

  enableSubmitButton(isValid: boolean) {
    this.isChild1FormValid = isValid;
  }
  1. 如果isChild1FormValid属性为true parent.component.html
  2. ,则启用提交按钮。
<form>
  <button type="submit" [disabled]="!isChild1FormValid">Submit</button>
</form>
  1. Full working demo in StackBlitz