Не удалось сохранить динамический FormArray в FormGroup - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть FormGroup, которая имеет три поля FormControl и одно поле FormArray, как показано на рисунке ниже.Требуется взять имя менеджера у пользователя, и после нажатия кнопки «Добавить» детали менеджера должны отображаться в таблице.В таблице предусмотрена кнопка удаления, при нажатии кнопки удаления менеджер должен быть удален из таблицы и списка.При отправке формы список менеджеров должен быть сохранен.Все отлично работает, кроме логики formArray.

enter image description here

Я пытался найти решение этой проблемы в Интернете (переходил по различным ссылкам: - https://alligator.io/angular/reactive-forms-formarray-dynamic-fields/, Angular 4 Form FormArray Добавить кнопку, чтобы добавить или удалить строку ввода формы ), но это не сильно помогло.Существует не так много материала о том, как хранить formArray в formGroup.Пожалуйста, предложите.

Ниже мой код, пожалуйста, посмотрите: -

1.manager-create-modal.component.html

<div>
    <form [formGroup]="createForm" (ngSubmit)="onFormCreation()">
        <div class="row">
             <div class="column">
               <div class="form-inline">
                 <div class="form-group">
                    <label for="remote_access_method">Remote Access Method: <font color="orange"> *</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
                      <input type="text" size='38' class="form-control" formControlName="remote_access_method" >
                 </div>
                </div>
               <br>
               <div class="form-inline">
                 <div class="form-group">
                    <label for="status">Current Status: <font color="orange"> *</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
                    <input type="text" size='38' class="form-control" formControlName="status">
                 </div>
               </div>
               <br>
               <div class="form-inline">
                 <div class="form-group">
                   <label for="secregid">Registration ID:<font color="orange"> *</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</label>
                   <input type="text" size='38' class="form-control" formControlName="secregid">
                 </div>
               </div>
               <br><br>
               <div class="form-inline">
                 <div class="form-group">
                    <br><br>
                    <div formArrayName="manager_formArray">
                      Enter name: <input type="text" class="form-control" formControlName="MgrName" size='50' >&nbsp;&nbsp;
                      <button type="button" class="btn btn-primary btn-sm" (click)="addPM()">Add</button>
                        <br><br>
                        <table class="table table-hover">
                          <tr><th>#</th><th>Manager Name</th><th>Remove</th></tr>
                          <tr *ngFor="let pm of createForm.get('manager_formArray').value; let id = index">
                              <td>{{id+1}}</td>
                              <td>{{pm.MgrName}}</td>
                              <td>
                                <span class="table-remove">
                                  <button type="button" class="btn btn-primary btn-sm" (click)="removeMgr(id)">Remove</button>
                                </span>
                              </td>
                          </tr>
                        </table>
                    </div>
                 </div>
               </div>
              </div>
              <br>
            </div>
            <br><br>
            <div class="form-group">
            <button class="btn btn-primary">Submit</button>
        </div>
    </form>
</div>

2.manager-create-modal.component.ts

    import { Component, OnInit } from '@angular/core';
    import { FormGroup, FormBuilder, FormArray, FormControl, Validators } from '@angular/forms';


    @Component({
      selector: 'app-manager-create-modal',
      templateUrl: './manager-create-modal.component.html',
      styleUrls: ['./manager-create-modal.component.css']
    })
    export class ManagerCreateModalComponent implements OnInit {

      createForm: FormGroup;
      manager_formArray: FormArray;
      remote_access_method: FormControl;
      status: FormControl;
      secregid: FormControl;

      constructor(private formBuilder: FormBuilder) { }

      createFormControls(){
        this.remote_access_method = new FormControl('');
        this.status = new FormControl('');
        this.secregid  = new FormControl('');
        this.manager_formArray = new FormArray([ this.createItem() ]);
      }

      createItem(): FormGroup {
          return this.formBuilder.group({
            MgrName: ''
          });
      }

      createFormVariables(){
          this.createForm = new FormGroup({
            remote_access_method  : this.remote_access_method,
            status  : this.status,
            secregid   : this.secregid,
            manager_formArray: this.manager_formArray,
          })
      }

      ngOnInit() {
          this.createFormControls();
          this.createFormVariables();
      }

      addPM(mgr: any): void {
          console.log("inside addPM");
          this.manager_formArray.push(this.formBuilder.group({MgrName:''}));
          console.log("list after addition:"+this.manager_formArray.value);

          for(let i = 0; i < this.manager_formArray.length; i++) {
             console.log(this.manager_formArray.at(i).value);
          }
      }

      get managerFormArray() {
       return this.manager_formArray.get('MgrName') as FormArray;
     }

     onFormCreation(){
       console.log("success")
     }
    }

Имя менеджера не отображается в таблице, и я продолжаю получать ошибку ниже: -

Ошибка ОШИБКИНе удается найти элемент управления с путем: 'manager_formArray -> MgrName' в _throwError (forms.js: 1731) в setUpControl (forms.js: 1639) в FormGroupDirective.push ../ node_modules/@angular/forms/fesm5/forms.js.FormGroupDirective.addControl (forms.js: 4456) в FormControlName.push ../ node_modules/@angular/forms/fesm5/forms.js.FormControlName._setUpControl (forms.js: 4961) в FormControlName.push ../ node_modules /@ angular / forms / fesm5 / forms.js.FormControlName.ngOnChanges (forms.js: 4911) в checkAndUpdateDirectiveInline (core.js: 9031) в checkAndUpdateNodeInline (core.js: 10299) в checkAndUpdateNode 10 (core): ugUjDUKUJDUCHUJDUCHUJUK(core.js: 10894) в debugCheckDirectivesFn (core.js: 10854) внутри addPM manager-create-modal.component.ts: 50 список после добавления: [объект Object], [объект Object] manager-create-modal.component.ts: 53 {MgrName: ""} manager-create-modal.component.ts: 53 {MgrName: ""}

Я даже не понимаю, почему элементы не добавляются в manager_formArray.Пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 03 декабря 2018

У вас есть несколько вопросов.Прежде всего, лучше переместить Input, который добавляет больше FormGroup s к вашему FormArray вне элемента <div formArrayName="manager_formArray"> -.По этой причине я создал новый FormControl this.mgrNameInput = new FormControl(''); (подробнее см. StackBlitz ).

Вам также необходимо добавить сообщение в новую запись, когда вы нажимаете Add -Кнопка, вызывающая addPM() -метод:

addPM(){ // removed the argument, using the controller inside the method instead.
    this.manager_formArray.push(this.formBuilder.group({MgrName:this.mgrNameInput.value}));
    this.mgrNameInput.reset(); // reset the input field.
}

Я также добавил метод удаления при удалении записи.

removeMgr(index: number){
    this.manager_formArray.removeAt(index);
}

Пожалуйста, отметьте StackBlitz для полного примера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...