Невозможно создавать динамические реактивные формы с помощью angular

Я пытаюсь создать динамическую реактивную форму с помощью angular, я могу зациклить ее, но она отображает точный способ

<form [formGroup] = "registerForm" (ngSubmit) = "onSubmit()">
  <div *ngFor = "let dat of formData;let index = index;">
     <label for = "{{dat.name}}">{{dat.name }}</label>
     <input type = "text" id = "{{dat.id}}" [formControlName] = "dat.name" />  
    </div>


</form>
<button type = "button"><button>

.ts

 registerForm: FormGroup;
  submitted = false;

  formData = [{ id: 'firstName', name: 'firstName' },
  { id: 'lastName', name: 'lastName' },
  { id: 'address', name: 'address' },
  { id: 'emailid', name: 'emailid' }
  ]


  constructor(private formBuilder: FormBuilder) {
    this.registerForm = this.formBuilder.group({
      formData: []
    });
   }

   onSubmit(){
    console.info(this.registerForm.value); 
   }

включая проверку

ниже мой URL-адрес stackblitz

https://stackblitz.com/edit/angular-awguej

Создаваемый вами массив может быть в виде массива angular.io/api/forms/FormArray.

Swoox 27.09.2018 08:18

не могли бы вы однажды проверить блиц моего стека и внести изменения?

Dexter 27.09.2018 08:20

То, что у вас есть, нет попытки установить элементы управления формой для вашей формы, поэтому это не сработает. Кроме того, это может быть использование чистых реактивных форм. Проверьте документацию и попытайтесь создать реактивную форму с FormArray: angular.io/guide/reactive-forms Если у вас возникнут проблемы, вернитесь и спросите :)

AJT82 27.09.2018 08:31

что вы подразумеваете под точным отображением?

KimCindy 27.09.2018 08:36

Мне потребовалось некоторое время, но я опубликовал это.

Swoox 27.09.2018 08:55
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
5
478
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

вы можете использовать для этого this.formBuilder.array.

Stackblitz

component.html

<form [formGroup] = "registerForm" (ngSubmit) = "onSubmit()">
    <div formArrayName = "formData">
        <div *ngFor = "let dat of registerForm.get('formData').controls;let index = index;" [formGroupName] = "index">
            <label>{{dat.get('name').value }}</label>
     <input type = "text" formControlName = "name" />  
    </div>
<button type = "submit">Submit</button>
  </div>
</form>
<button type = "button" (click) = "addNew()">Add</button>

component.ts

registerForm: FormGroup;
  submitted = false;

  constructor(private formBuilder: FormBuilder) {
    this.registerForm = this.formBuilder.group({
      formData: this.formBuilder.array([this.createNewGroup()])
    });
   }

   createNewGroup() {
    return this.formBuilder.group({
      id: ['id'], 
      name: ['name'] 
    })
  }

  addNew(){
    let formArr=this.registerForm.get('formData') as FormArray;
    formArr.push(this.createNewGroup());
  }

   onSubmit(){
    console.info(this.registerForm.value); 
   }

Я добавил значение, потому что вам нужен идентификатор для управления полем ввода, имя для установки метки и значение для установки значения. Если вы выберете более динамичный способ, это пригодится.

В своем компоненте вы делаете:

formData = [{ id: 'firstName', name: 'firstName', value: '' },
  { id: 'lastName', name: 'lastName', value: '' },
  { id: 'address', name: 'address', value: '' },
  { id: 'emailid', name: 'emailid', value: '' }
  ]

  constructor(private formBuilder: FormBuilder) {
    let formGroups: FormGroup[] = []; 
    for(let i = 0; i < this.formData.length; i++){
      formGroups.push(this.formBuilder.group({
          id: this.formData[i].id,
          name: this.formData[i].name,
          value: this.formData[i].value,
      }));
    }
    this.registerForm = this.formBuilder.group({
        array: this.formBuilder.array(formGroups)
    })
   }

   onSubmit(){
    console.info(this.registerForm.value); 
   }

И в html:

<form [formGroup] = "registerForm" (ngSubmit) = "onSubmit()">
  <div formArrayName = "array">
    <div *ngFor = "let dat of registerForm.get('array').controls;let i = index;" [formGroupName] = "i">
        <label>{{dat.get('name').value}} </label>
        <input type = "string" id = {{dat.value.id}} #input formControlName = "value">
    </div>
  </div>
</form>

<button><button>

Вы также можете добавить такие элементы управления.

component.ts

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

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

  registerForm: FormGroup;
  submitted = false;

  formData = [{ id: 'firstName', name: 'firstName' },
  { id: 'lastName', name: 'lastName' },
  { id: 'address', name: 'address' },
  { id: 'emailid', name: 'emailid' }
  ]


  constructor(private formBuilder: FormBuilder) {
    this.registerForm = this.formBuilder.group({
      list: this.formBuilder.array([])
    });
  }

  ngOnInit() {
    this.registerForm = this.formBuilder.group({
      list: this.formBuilder.array(
        this.formData.map(x => this.formBuilder.group({
          name: [x['name']],
          id: [x['id']]
        }))
      )
    })
  }

  onSubmit() {
    console.info(this.registerForm.value);
  }
}

Component.html

<form [formGroup] = "registerForm" (ngSubmit) = "onSubmit()">
  <span formArrayName = "list">
  <div *ngFor = "let dat of registerForm.get('list').controls;let index = index;" formGroupName = "{{index}}">
     <label for = "{{dat.name}}">{{dat.name }}</label>
     <input type = "text" id = "{{dat.get('id').value}}" formControlName = "name" />  
    </div>
  </span>
<button type = "submit">button</button>
</form>

Чтобы дополнить ответ Кришны, если вы хотите создать formArray с данными, вы можете создать две функции.

//create a formGroup with the data or empy if not data
createNewGroup(data):FormGroup {
    return this.formBuilder.group({
        id: [data?data.id:null], 
        name: [data?data.name:null] 
    })
}

//And a function to create the form

createForm(formData):formGroup
{
    //create an array of FormGroup,
    //if data, with each element of data a newGroup
    //else an array with one element
    let group=formData? formData.map(d=>this.createNewGroup(d))
                      :[this.createNewGroup(null)]

    return this.formBuilder.group({
         formData: this.formBuilder.array(group)
       });
}

Так что вы можете

this.registerForm=createform(this.formData) //create a form with data
this.registerForm=createform(null) //create a empty form

Другие вопросы по теме