Динамическое добавление и удаление formgroup в formarray angular

#angular #angular-forms

#angular #angular-формы

Вопрос:

Я пытаюсь динамически добавлять и удалять formgroup в formarray с помощью компонента counter. В цикле for есть 4 компонента счетчика, которые имеют категорию. Когда пользователь нажимает на кнопку добавить, счетчик увеличивается и добавляет formgroup в formarray. Здесь нет никаких проблем.

Но теперь я застрял с удалением нужной formgroup. Когда пользователь нажимает на кнопку удаления в formgroup или уменьшает счетчик, я хочу удалить нужную группу. Итак, при уменьшении мне нужно, чтобы последняя formgroup в этой категории была удалена, и при нажатии кнопки удаления я хочу, чтобы счетчик уменьшился на 1 и удалил formgroup.

Это то, что у меня есть до сих пор:

компонент формы

  profileForm: FormGroup;

ngOnInit() {
    this.profileForm = this.fb.group({
      Age: new FormControl(0),
      PartnerAge: new FormControl(0),
      Children: this.fb.array([]),
    });
  
  }

 childRange = ScheidenChildRange;
  childList = [
    this.childRange.ZeroToThree,
    this.childRange.FourToTwelve,
    this.childRange.ThirteenToSeventeen,
    this.childRange.OlderThanEighteen,
  ];

get ChildrenArray() {
    return this.profileForm.get("Children") as FormArray;
  }

  initChildRow(age) {
    return this.fb.group({
      Age: new FormControl(age),
      BSOOrVSO: new FormControl(null),
      BSOOrVSOCostsPerMonth: new FormControl(null),
      BSOOrVSOHoursAWeek: new FormControl(null),
      Childminder: new FormControl(null),
      ChildminderCostsPerMonth: new FormControl(null),
      ChildminderHoursAWeek: new FormControl(null),
      FormalChildcare: new FormControl(null),
    });
  }

  addChild(count: number, childRange: ScheidenChildRange) {
    this.ChildrenArray.push(this.initChildRow(childRange));
    this.onInputChange.next();
  }

  removeChild(age: any) {
    const index = this.ChildrenArray.controls.findIndex(
      (c) => c.value.Age === age.index
    );
    this.ChildrenArray.removeAt(index);
    this.removeEvent.next(age);
    this.onInputChange.next();
  }
  
 
        <counter *ngFor="let child of childList | keyvalue; index as i" (incremented)="addChild($event, child.value)"
          (decremented)="removeChild($event)" [decrementEvent]="removeEvent.asObservable()" [index]="i" [max]="5"
          [label]="child.value | getChildRange">
        </counter>


    <div formArrayName="Children">
      <ng-container *ngFor="let child of ChildrenArray.controls; index as i">
        <child-questions *ngIf="child.get('Age').value === 0 || child.get('Age').value === 1"
          [Descriptions]="Descriptions" [formGroupName]="i" [Index]="i" [form]="child"
          (removeChildEv)="removeChild($event)" (inputChanged)="radioChecked()">
        </child-questions>
  

встречный компонент

 increment() {
    if (this.counter === this.max) {
      return;
    }
    this.counter  = 1;
    this.incremented.emit({ count: this.counter, index: this.index });
  }

  decrement() {
    if (
      (!this.negativeAllowed amp;amp; this.counter === 0) ||
      this.counter < this.min
    ) {
      return;
    }
    this.counter -= 1;
    this.decremented.emit({ count: this.counter, index: this.index });
  }

  constructor() {}

  ngOnInit() {
    if (this.decrementEvent) {
      this.eventsSubscription = this.decrementEvent.subscribe((data) => {
        console.log("Counter", data);
        if (this.index === data.index) {
          this.decrement();
        }
      });
    }
  }

  @HostListener("unloaded")
  ngOnDestroy(): void {
    this.eventsSubscription.unsubscribe();
  }
  

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

1. Можете ли вы создать ссылку stackblitz с вашей проблемой? было бы легче понять

Ответ №1:

Чтобы удалить FormGroup из FormArray, просто передайте индекс FormGroup функции.

В шаблоне:

     <div formArrayName="Children">
  <ng-container *ngFor="let child of ChildrenArray.controls; index as i">
    <child-questions *ngIf="child.get('Age').value === 0 || child.get('Age').value === 1"
      [Descriptions]="Descriptions" [formGroupName]="i" [Index]="i" [form]="child"
      (removeChildEv)="removeChild($event,i)" (inputChanged)="radioChecked()">
    </child-questions>
  

В функции removeChild:

 removeChild(age: any, index: number) {
  this.ChildrenArray.removeAt(index);
  this.removeEvent.next(age);
  this.onInputChange.next();
}