1

i have used formArray to loop the values and on selection of one item, we can move right and left based on which side we have selected.Here, i am selecting last item from right and moving to left, then i select last but one and move that to left. Then the duplicate value has come. I think it is due to index value mismatch. I am not able to rectify this issue. can anyone help me out to solve this.

DEMO: Working Demo

HTML:

<div class="card-body overflow-auto py-0" formArrayName="agentNotGroupView">
                  <div class="swap-list-item" *ngFor="let items of agentNotinView; let i = index" [formGroupName]="i"
                    [class.selected]="selected2.includes(items)">
                    <input formControlName="agentNotInViewValue" [readOnly]="true" (click)="onSelect(2, items)" [disabled] = "isReadOnly"/>
                  </div>
                </div>

TS:

    this.agentNotInViewArray = this.FB.array(
            this.agentNotinView.map(x => this.FB.group({
              agentNotInViewValue: this.FB.control(x.value)
            }))
          );
    
          this.agentGroupNotViewInfoForm = this.FB.group({
            agentNotGroupView: this.agentNotInViewArray
          })

move from one button to other:
moveFrom(fromListNumber: number) {
    const selected: MyInterface[] = this.getSelected(fromListNumber);
    if (selected.length === 0) {
      return;
    }

    const toListNumber: number = fromListNumber === 1 ? 2 : 1;

    const fromModel: MyInterface[] = this.getModel(fromListNumber);
    const fromFormArray: FormArray = this.getFormArray(fromListNumber);

    const toModel: MyInterface[] = this.getModel(toListNumber);
    const toFormArray: FormArray = this.getFormArray(toListNumber);

    // remove items and form groups    
    selected.forEach((item) => {
      const index: number = fromModel.indexOf(item);
      const formGroup: FormGroup = fromFormArray.controls[index] as FormGroup;

      // remove from model
      fromModel.splice(index, 1);
      // remove from from array
      fromFormArray.removeAt(index);

      // add to form array
      toFormArray.push(formGroup);
      // add item to model
      toModel.push(item);
    });
    // clear selected
    selected.length = 0;
  this.groupInfoForm();
  this.notGroupInfoForm();
    }

As per my debug, items.value and items.id comes fine, but formcontrolName gives the duplicate value. help needed to rectify this.

1 Answer 1

0

I was able to solve this by adding an if ans else condition while calling the form again, so it was.

TS:

moveFrom(fromListNumber: number) {
    const selected: MyInterface[] = this.getSelected(fromListNumber);
    if (selected.length === 0) {
      return;
    }

    const toListNumber: number = fromListNumber === 1 ? 2 : 1;

    const fromModel: MyInterface[] = this.getModel(fromListNumber);
    const fromFormArray: FormArray = this.getFormArray(fromListNumber);

    const toModel: MyInterface[] = this.getModel(toListNumber);
    const toFormArray: FormArray = this.getFormArray(toListNumber);

    // remove items and form groups    
    selected.forEach((item) => {
      const index: number = fromModel.indexOf(item);
      const formGroup: FormGroup = fromFormArray.controls[index] as FormGroup;

      // remove from model
      fromModel.splice(index, 1);
      // remove from from array
      fromFormArray.removeAt(index);

      // add to form array
      toFormArray.push(formGroup);
      // add item to model
      toModel.push(item);
    });
    // clear selected
    selected.length = 0;
    if(fromListNumber == 2) {
  this.groupInfoForm();
    } else if(fromListNumber == 1) {
  this.notGroupInfoForm();
    }
    }
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.