如何在父组件内的方法中在子组件中使用FormArray

时间:2018-12-04 06:24:46

标签: angular angular6 angular-reactive-forms formgroups

我正在用反应形式构建角度为6的形式,并且我在每个部分使用组件,但我遇到一些问题: 我如何在父组件内的方法中在子组件中使用FormArray。 例如:

在父ts文件中:

  constructor(private fb: FormBuilder, 
    private http: Http) { }

  ngOnInit() {

    this.parentForm = this.fb.group({
  _server: this.fb.array([this.initItemRows()]),
   })
 }


  initItemRows() {
    return this.fb.group({
      // DocumentID:  uuid(),
      HostName: [],
      IPAddress: [],
      Domain: [],
      OS: []
    });
}


  get serverForms() {
    return this.parentForm.get('_server') as FormArray
  }

  addServer() {

    const server = this.fb.group({ 
      // DocumentID:  uuid(),
      HostName: [],
      IPAddress: [],
      Domain: [],
      OS: []
    })

    this.serverForms.push(server);
  }

  deleteServer(i) {
    this.serverForms.removeAt(i)
  }

在父HTML中,我有:

<div formArrayName="_server">
    <table id="_server" class="table table-striped table-bordered">
        <thead>
            <tr>
                <th>Host name</th>
                <th>IP</th>
                <th>Domain</th>
                <th>OS</th>
                <th>action</th>
            </tr>
        </thead>
        <tbody>

            <tr *ngFor="let server of serverForms.controls; let i=index" [formGroupName]="i">
                <td>
                    <input formControlName="HostName" class="form-control" type="text" />
                </td>
                <td>
                    <input formControlName="IPAddress" class="form-control" type="text" />
                </td>
                <td>
                    <input formControlName="Domain" class="form-control" type="text" />
                </td>
                <td>
                    <input formControlName="OS" class="form-control" type="text" />
                </td>
                <td class="buttonCenter">
                    <button mat-raised-button color="primary" class="deleteFieldButton" (click)="deleteServer(i)" type="button">delete</button>
                </td>
            </tr>
        </tbody>
        <button mat-raised-button color="primary" class="addFieldButton" (click)="addServer()" type="button">insert row</button>

    </table>
</div>

但是我想使用父级(上面)的所有html代码放在子级组件中

 <app-servers-section></app-servers-section>

我知道我可以在子组件内部使用FormGroupDirective,但是当我需要使用父方法时,它就无法工作。

请指教! 谢谢!

1 个答案:

答案 0 :(得分:0)

您需要执行以下操作。

 <app-servers-section (changeInChildForm)="doSomething($event)"></app-servers-section>

在子组件中要保留表单的位置,您需要从那里发出一个事件。

因此,在您的ChildComponent.ts中,将 EventEmitter Output 与Component和其他内容一起导入

import { Component, EventEmitter, Input, Output } from '@angular/core';

在类的正文中,您可以执行类似的操作以发出要从子代传递给父代的事件。

@Output() changeInChildForm = new EventEmitter<boolean>();

  somethingHappenedInChild(data: any) {
    this.changeInChildForm.emit(data);
  }

因此,当您想从子项中发出更改时,请调用子项组件的方法somethingHappenedInChildchangeInChildForm将发出,它将调用Parent组件的方法doSomething($event)

我没有创建堆叠闪电战。但是,如果您需要更多与此相关的帮助,请像前面提到的那样创建一个堆叠闪电战。