Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reactive form using multiple selection on new option selection error

Is there an example on how to implement multiple selection and reactive form ?

I'm trying to set the selected items (retrieved from the database) on the multiselect-dropdown, it will update the items displayed (the view), but it throws following error:

core.js:12501 ERROR TypeError: control.registerOnChange is not a function
    at setUpModelChangePipeline (forms.js:2064)
    at setUpControl (forms.js:2007)
    atFormGroupDirective.push../node_modules/@angular/forms/fesm5/forms.js.FormGroupDirective.addControl 
    (forms.js:4969)
    at FormControlName.push../node_modules/@angular/forms/fesm5/forms.js.FormControlName._setUpControl 
    (forms.js:5572)
    at FormControlName.push../node_modules/@angular/forms/fesm5/forms.js.FormControlName.ngOnChanges 
    (forms.js:5491)
    at checkAndUpdateDirectiveInline (core.js:18533)
    at checkAndUpdateNodeInline (core.js:19801)
    at checkAndUpdateNode (core.js:19763)
    at prodCheckAndUpdateNode (core.js:20304)
    at Object.eval [as updateDirectives] (AddAppointmentsComponent.ngfactory.js:646)

I was trying to select new option getting error.

core.js:12501 ERROR Error: Cannot find form control at index 3
    at FormArray.push../node_modules/@angular/forms/fesm5/forms.js.FormArray._throwIfControlMissing (forms.js:4001)
    at forms.js:3870
    at Array.forEach (<anonymous>)
    at FormArray.push../node_modules/@angular/forms/fesm5/forms.js.FormArray.setValue (forms.js:3869)
    at updateControl (forms.js:2059)
    at MultiSelectComponent.onChangeCallback (forms.js:2044)
    at MultiSelectComponent.push../node_modules/ng-multiselect-dropdown/fesm5/ng-multiselect- 
    dropdown.js.MultiSelectComponent.addSelected (ng-multiselect-dropdown.js:348)
    at MultiSelectComponent.push../node_modules/ng-multiselect-dropdown/fesm5/ng-multiselect- 
    dropdown.js.MultiSelectComponent.onItemClick (ng-multiselect-dropdown.js:160)
    at Object.eval [as handleEvent] (MultiSelectComponent.ngfactory.js:135)
    at Object.handleEvent (core.js:19545)

data

"questionnaireData":[{"questionnaireId":"Xvqo5atpw",

                      "timeRepeat":[    
                                    {"item_id":1,"item_text":"01:00"},
                                    {"item_id":2,"item_text":"02:00"},
                                    {"item_id":2,"item_text":"02:00"}
                                   ]    
                    }],

In the component formArray assigning to formBuilder.array(ap.timeRepeat).

component.ts

this.addAppointmentForm.setControl('questionnaireData', 
this.setExistingQuestionnairesDetails(this.AppointmentList.questionnaireData));

setExistingQuestionnairesDetails(questionDataArray: IQuestionnaireData[]): FormArray {
    const formArray = new FormArray([]);
    console.log(questionDataArray);
    questionDataArray.forEach(ap=>{

      formArray.push(this.formBuilder.group({
        questionnaireId: ap.questionnaireId,
        timeRepeat: this.formBuilder.array(ap.timeRepeat),

      }))
    })
    return formArray;
  }

compnent.html

<ng-multiselect-dropdown formControlName="timeRepeat" [data]="dropdownList"
  [(ngModel)]="timeRepeat" [settings]="dropdownSettings" (onSelect)="onItemSelect($event)" 
  (onSelectAll)="onSelectAll($event)" (onDeSelect)="onDeSelect($event)">
 </ng-multiselect-dropdown>

Please let me know how I can get around this error or some better way to get things done.

like image 852
Vijay Thota Avatar asked Sep 05 '25 03:09

Vijay Thota


1 Answers

don't mix Reactive and template forms (not use for a controel [(ngModel)] and formControlName for the same input). And if you use a control, you needn't use (onDeSelect, onSelectAll nor onSelect). BTW, a ng-multiselect-dropdown store an array.

Yes, you needn't a FormArray, just a formControl (or if you use [(ngModel)] an unique variable that is an array). And yes, a FormControl can store an array or an object

The most simple example in stackblitz

We has a data

  this.data = [
      { item_id: 1, item_text: 'Hanoi' },
      { item_id: 2, item_text: 'Lang Son' },
      { item_id: 3, item_text: 'Vung Tau' },
      { item_id: 4, item_text: 'Hue' },
      { item_id: 5, item_text: 'Cu Chi' }
    ];

and the form is

   this.form = new FormGroup({
      name: new FormControl([this.data[0],this.data[2]], Validators.required)
    });

The .html

<form [formGroup]="form" (ngSubmit)="save()" (reset)="resetForm()">

    <ng-multiselect-dropdown #multiSelect
      [placeholder]="'Select City'" 
      [data]="data" 
      formControlName="name" 
      [settings]="settings"
      [disabled]="false"
>
        </ng-multiselect-dropdown>

    <span *ngIf="form.get('name')?.errors?.required" style="color: red;">
      City is required
    </span>

    <br/><br/>

    <input type="submit" value="Submit"> | <input type="reset" value="Reset">

  </form>
like image 180
Eliseo Avatar answered Sep 07 '25 21:09

Eliseo