Угловые реактивные формы formgroup

#javascript #angular #angular-reactive-forms #angular-forms #angular-formbuilder

#javascript #угловые #угловые реактивные формы #угловые формы #angular-formbuilder

Вопрос:

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

Ожидаемый формат JSON:

 {
  "title": null,
  "days": [
    {
      "date": null,
      "nodes": [
        {
          "type": "leg",
          "from": null,
          "to": null
        },
        {
          "type": "activity",
          "category": null
        }
      ]
    }
  ]
}
  

Я реализовал управление в day и node, для которых я смог добавлять и удалять поля формы соответственно, однако мне нужны отдельные элементы управления для типа leg и activity под узлами.

Есть ли какой-либо способ реализовать вложенный FormControl здесь?

Обновление: нужны две formgroups под массивом форм, пожалуйста, помогите реализовать в HTML.

 initX() {
    return this.fb.group({
      'date': [],
      'nodes': this.fb.array([
        this.initY(),
        this.initZ()
      ]),
    });
  }

  initY() {
    return this.fb.group({
      'type': ['leg'],
      'from': [],
      'to': []
    })
  }

  initZ() {
    return this.fb.group({
      'type': ['activity'],
      'category':[],
      'cost':[]
    })
  }
  

Ошибка: не удается найти элемент управления с путем: ‘дни -> 0 -> узлы -> 1 -> из’

Можно найти stackblitz примера кода здесь: https://stackblitz.com/edit/angular-ivy-fkgxrr

Комментарии:

1. Неясно, что вы подразумеваете под «мне нужны отдельные элементы управления для типа leg и activity под узлами», потому что в вашем примере у вас уже есть два разных метода с разными возвращаемыми структурами.

2. Привет @FrancescoColamonici Я смог отформатировать в формате JSON, однако в FormArray под HTML нет никаких элементов управления. Дни и узлы зацикливаются индивидуально с помощью отдельных элементов управления, я хочу, чтобы то же самое было сделано для этапа и действий, однако под узлами.

3. @FrancescoColamonici Я обновил свое описание.

Ответ №1:

ну, в моем другом ответе массив «узлов» выглядит так

 [
 {"type": "leg","from": null,"to": null,"category": null}
 {"type": "leg","from": null,"to": null,"category": null}
]
  

Все необходимые для FormArray элементы имеют одинаковые свойства

Вопрос: узлы — это только массив с двумя элементами (один для элемента управления, а другой для категории управления)?

В этом случае days — это FormArray, каждый элемент представляет собой FormGroup с двумя peopleeries, один из которых представляет собой массив (не FormArray) с двумя элементами

 form=new FormGroup({
  title:new FormControl()
  days:new FormArray([
     date:new FormControl(),
     nodes:[new FormGroup({...}),new FormGroup({..})]
  ])
})
  

в этом случае у вас может быть три геттера

 get days():FormArray
{
    return this.formGroup.get('days') as FormArray;
}
get leg(index)
{
    return this.days.at(i).get('nodes')[0] as FormGroup
}
get category(index)
{
    return this.days.at(i).get('nodes')[1] as FormGroup
}
  

И использовать непосредственно [formGroup] в div, например

 <div [formGroup]="category[i]">
   <input formControlName="from">
   ...
</div>
  

иначе я не могу понять ваш json

Ответ №2:

Попробуйте использовать двустороннюю привязку данных. Это упростит ваш процесс.

Например:

 <input type="text" name="name" [(ngModel)]="model.name">
  

Ответ №3:

keethama, шаг за шагом. У вас есть FormArray внутри FormArray, поэтому создайте две функции, которые возвращают FormArray

   get days():FormArray
  {
    return this.formGroup.get('days') as FormArray;
  }
  getNodes(i:number):FormArray
  {
    return this.days.at(i).get('nodes') as FormArray
  }
  

Ну, чтобы создать форму, разделите и используйте три функции:

   createForm(data:any)
  {
    data=data || {title:null,days:null}
    return new FormGroup({
      title:new FormControl(data.title),
      days:data.days?
           new FormArray(data.days.map(d=>this.createDays(d))):
           new FormArray([])
      
    })
  }
  createDays(data:any=null)
  {
    data=data || {date:null,nodes:null}
    return new FormGroup({
        date:new FormControl(data.date),
        nodes:data.nodes?
              new FormArray(data.nodes.map(x=>this.createNodes(x))):
              new FormArray([])
    })
  }
  createNodes(data:any=null)
  {
    data={type:null,from:null,to:null,category:null,...data}
    return new FormGroup({
      type: new FormControl(data.type),
      from: new FormControl(data.from),
      to: new FormControl(data.to),
      category: new FormControl(data.category)
    })
  }
  

Ну, теперь взгляните на .html

 <form *ngIf="formGroup" [formGroup]="formGroup">
  title:<input formControlName="title">
  <div formArrayName="days">
    <div *ngFor="let groupDays of days.controls;let i=index" [formGroupName]="i">
        date:<input formControlName="date">
        <div formArrayName="nodes">
          <div *ngFor="let groupnodes of getNodes(i).controls;let j=index" [formGroupName]="j">        
            type:<input formControlName="type"><br/>
        from:<input formControlName="from"><br/>

        to:<input formControlName="to"><br/>
        category:<input formControlName="category">
          </div>
        </div>
    </div>
  </div>
</form>
  

И в ngOnInit

 this.formGroup=this.createForm(this.data)
  

Посмотрите, что если вы хотите добавить новый узел к узлу в индексе index, который вы используете

    this.getNodes(index).push(this.createNodes())
  

И добавить новый узел в массив дней

    this.days.push(this.createDays())
  

Неполный стекблитц

Комментарии:

1. Привет .. Спасибо за пример кода, однако код здесь по-прежнему имеет тот же FormArray и элементы управления для всех узлов. Мне нужны элементы управления для этапа и активности отдельно под узлами. Есть ли какие-либо возможные предложения?

2. узлы — это только массив с двумя элементами (один для элемента управления, а другой для категории управления)? Если true, посмотрите мой другой ответ, иначе я не могу понять ваш json.

Ответ №4:

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