Как использовать FormArray в дочернем компоненте с методами внутри parent - PullRequest
0 голосов
/ 04 декабря 2018

Я строю форму в angular 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 голосов
/ 04 декабря 2018

Вам нужно сделать что-то подобное.

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

, а в дочернем компоненте, где вы хотите сохранить свою форму, вам нужно отправить событие оттуда.

так, в вашем импорте ChildComponent.ts EventEmitter и Вывод с Компонентом и другими вещами

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

, а в теле класса вы можете сделать что-то подобное для излучениясобытие, которое вы хотите передать родителю от потомка.

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

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

Итак, если вы хотите передать изменение от потомков, вызовите метод somethingHappenedInChild дочернего компонента.changeInChildForm будет отправлено, вызовет метод doSomething($event) родительского компонента.

Я не создал стек стлиц.Но если вам нужна дополнительная помощь по этому вопросу, создайте один стек, как уже упоминалось ранее.

...