My dynamic fields iterated form is not functional, can't type into ion-inputs and its still a bit sluggish when looping more than 3 items

Dear all,

I have created several forms in this app but this specific form is autopopulated with data from the database and at the same time, some fields are supposed to be looped over, still with data from the database. Originally, the form was not dynamic, but even with more than 10 items, it would load very fast and operate well, but now that the fields are iterated, even if its only one field, it loads well but when I try to scroll, it takes 5 seconds to scroll down, I can’t even type in the input. I’ve been going over this for several days but I’m getting nowhere. Kindly help:

FORM HTML

<tbody  class="seizure_item" [formGroupName]="i"  *ngFor="let med of entry.controls.medication.value; let i = index">
        <tr>
          <td rowspan="4"><ion-textarea readonly value="{{med.medicine}}" formControlName="medicine_var" placeholder="Medication..."></ion-textarea></td>
          <td><ion-input readonly value="{{med.hour_1}}" formControlName="hour_1_var" placeholder="Hour" autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][1]}}" formControlName="medicalfg_1" placeholder="1" [class]="one"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][2]}}" formControlName="medicalfg_2" placeholder="2" [class]="two"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][3]}}" formControlName="medicalfg_3" placeholder="3" [class]="three"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][4]}}" formControlName="medicalfg_4" placeholder="4" [class]="four"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][5]}}" formControlName="medicalfg_5" placeholder="5" [class]="five"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][6]}}" formControlName="medicalfg_6" placeholder="6" [class]="six"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][7]}}" formControlName="medicalfg_7" placeholder="7" [class]="seven"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][8]}}" formControlName="medicalfg_8" placeholder="8" [class]="eight"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][9]}}" formControlName="medicalfg_9" placeholder="9" [class]="nine"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][10]}}" formControlName="medicalfg_10" placeholder="10" [class]="ten"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][11]}}" formControlName="medicalfg_11" placeholder="11" [class]="eleven"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][12]}}" formControlName="medicalfg_12" placeholder="12" [class]="twelve"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][13]}}" formControlName="medicalfg_13" placeholder="13" [class]="thirteen"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][14]}}" formControlName="medicalfg_14" placeholder="14" [class]="fourteen"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][15]}}" formControlName="medicalfg_15" placeholder="15" [class]="fifteen"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][16]}}" formControlName="medicalfg_16" placeholder="16" [class]="sixteen"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][17]}}" formControlName="medicalfg_17" placeholder="17" [class]="seventeen"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][18]}}" formControlName="medicalfg_18" placeholder="18" [class]="eighteen"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][19]}}" formControlName="medicalfg_19" placeholder="19" [class]="nineteen"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][20]}}" formControlName="medicalfg_20" placeholder="20" [class]="twenty"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][21]}}" formControlName="medicalfg_21" placeholder="21" [class]="twentyOne"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][22]}}" formControlName="medicalfg_22" placeholder="22" [class]="twentyTwo"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][23]}}" formControlName="medicalfg_23" placeholder="23" [class]="twentyThree"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][24]}}" formControlName="medicalfg_24" placeholder="24" [class]="twentyFour"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][25]}}" formControlName="medicalfg_25" placeholder="25" [class]="twentyFive"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][26]}}" formControlName="medicalfg_26" placeholder="26" [class]="twentySix"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][27]}}" formControlName="medicalfg_27" placeholder="27" [class]="twentySeven"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][28]}}" formControlName="medicalfg_28" placeholder="28" [class]="twentyEight"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][29]}}" formControlName="medicalfg_29" placeholder="29" [class]="twentyNine"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][30]}}" formControlName="medicalfg_30" placeholder="30" [class]="thirty"  autocomplete="true" autocorrect="on"></ion-input></td>
          <td><ion-input value="{{recordData[40][0][31]}}" formControlName="medicalfg_31" placeholder="31" [class]="thirtyOne"  autocomplete="true" autocorrect="on"></ion-input></td>
          </tr>
          

..ETC 

`

The above part is the one that causes sluggish operation and when data is iterated into it even if its of length 1, it won’t allow me to type into the inputs, but it will iterate well, showing data in boxes where its supposed to be.

Here is ts CODE responsible for this part:

// THIS CODE IS IN HE CONSTRUCTOR

    this.entry = this.formBuilder.group({
      medication: this.formBuilder.array([]),
      seizures: this.formBuilder.array([this.createItem()]),
      bowel_movement: this.formBuilder.array([this.createBowel()]),
      individual_id: ['', Validators.required],
      first_name: ['', Validators.required],
      last_name: ['', Validators.required],
      facility_name: ['', Validators.required],
      month: ['', Validators.required],
      year: ['', Validators.required],
      diagnosis: [''],
      diet: [''],
      precautions: [''],
      allergies: [''],
      physician_name: [''],
      physician_number: [''],
      name_one: [''],
      name_two: [''],
      record_number: [''],
      dob_resident: [''],
      sex: [''],

      bp1_systolic_1: [''],
      bp1_systolic_2: [''],
      bp1_systolic_3: [''],
      bp1_systolic_4: [''],
      bp1_systolic_5: [''],
      bp1_systolic_6: [''],
      bp1_systolic_7: [''],
      bp1_systolic_8: [''],
      bp1_systolic_9: [''],
      bp1_systolic_10: [''],
      bp1_systolic_11: [''],
      bp1_systolic_12: [''],
      bp1_systolic_13: [''],
      bp1_systolic_14: [''],
      bp1_systolic_15: [''],
      bp1_systolic_16: [''],
      bp1_systolic_17: [''],
      bp1_systolic_18: [''],
      bp1_systolic_19: [''],
      bp1_systolic_20: [''],
      bp1_systolic_21: [''],
      bp1_systolic_22: [''],
      bp1_systolic_23: [''],
      bp1_systolic_24: [''],
      bp1_systolic_25: [''],
      bp1_systolic_26: [''],
      bp1_systolic_27: [''],
      bp1_systolic_28: [''],
      bp1_systolic_29: [''],
      bp1_systolic_30: [''],
      bp1_systolic_31: [''],

      bp1_diastolic_1: [''],
      bp1_diastolic_2: [''],
      bp1_diastolic_3: [''],
      bp1_diastolic_4: [''],
      bp1_diastolic_5: [''],
      bp1_diastolic_6: [''],
      bp1_diastolic_7: [''],
      bp1_diastolic_8: [''],
      bp1_diastolic_9: [''],
      bp1_diastolic_10: [''],
      bp1_diastolic_11: [''],
      bp1_diastolic_12: [''],
      bp1_diastolic_13: [''],
      bp1_diastolic_14: [''],
      bp1_diastolic_15: [''],
      bp1_diastolic_16: [''],
      bp1_diastolic_17: [''],
      bp1_diastolic_18: [''],
      bp1_diastolic_19: [''],
      bp1_diastolic_20: [''],
      bp1_diastolic_21: [''],
      bp1_diastolic_22: [''],
      bp1_diastolic_23: [''],
      bp1_diastolic_24: [''],
      bp1_diastolic_25: [''],
      bp1_diastolic_26: [''],
      bp1_diastolic_27: [''],
      bp1_diastolic_28: [''],
      bp1_diastolic_29: [''],
      bp1_diastolic_30: [''],
      bp1_diastolic_31: [''],

      pulse_1: [''],
      pulse_2: [''],
      pulse_3: [''],
      pulse_4: [''],
      pulse_5: [''],
      pulse_6: [''],
      pulse_7: [''],
      pulse_8: [''],
      pulse_9: [''],
      pulse_10: [''],
      pulse_11: [''],
      pulse_12: [''],
      pulse_13: [''],
      pulse_14: [''],
      pulse_15: [''],
      pulse_16: [''],
      pulse_17: [''],
      pulse_18: [''],
      pulse_19: [''],
      pulse_20: [''],
      pulse_21: [''],
      pulse_22: [''],
      pulse_23: [''],
      pulse_24: [''],
      pulse_25: [''],
      pulse_26: [''],
      pulse_27: [''],
      pulse_28: [''],
      pulse_29: [''],
      pulse_30: [''],
      pulse_31: [''],

      bp2_systolic_1: [''],
      bp2_systolic_2: [''],
      bp2_systolic_3: [''],
      bp2_systolic_4: [''],
      bp2_systolic_5: [''],
      bp2_systolic_6: [''],
      bp2_systolic_7: [''],
      bp2_systolic_8: [''],
      bp2_systolic_9: [''],
      bp2_systolic_10: [''],
      bp2_systolic_11: [''],
      bp2_systolic_12: [''],
      bp2_systolic_13: [''],
      bp2_systolic_14: [''],
      bp2_systolic_15: [''],
      bp2_systolic_16: [''],
      bp2_systolic_17: [''],
      bp2_systolic_18: [''],
      bp2_systolic_19: [''],
      bp2_systolic_20: [''],
      bp2_systolic_21: [''],
      bp2_systolic_22: [''],
      bp2_systolic_23: [''],
      bp2_systolic_24: [''],
      bp2_systolic_25: [''],
      bp2_systolic_26: [''],
      bp2_systolic_27: [''],
      bp2_systolic_28: [''],
      bp2_systolic_29: [''],
      bp2_systolic_30: [''],
      bp2_systolic_31: [''],

      bp2_diastolic_1: [''],
      bp2_diastolic_2: [''],
      bp2_diastolic_3: [''],
      bp2_diastolic_4: [''],
      bp2_diastolic_5: [''],
      bp2_diastolic_6: [''],
      bp2_diastolic_7: [''],
      bp2_diastolic_8: [''],
      bp2_diastolic_9: [''],
      bp2_diastolic_10: [''],
      bp2_diastolic_11: [''],
      bp2_diastolic_12: [''],
      bp2_diastolic_13: [''],
      bp2_diastolic_14: [''],
      bp2_diastolic_15: [''],
      bp2_diastolic_16: [''],
      bp2_diastolic_17: [''],
      bp2_diastolic_18: [''],
      bp2_diastolic_19: [''],
      bp2_diastolic_20: [''],
      bp2_diastolic_21: [''],
      bp2_diastolic_22: [''],
      bp2_diastolic_23: [''],
      bp2_diastolic_24: [''],
      bp2_diastolic_25: [''],
      bp2_diastolic_26: [''],
      bp2_diastolic_27: [''],
      bp2_diastolic_28: [''],
      bp2_diastolic_29: [''],
      bp2_diastolic_30: [''],
      bp2_diastolic_31: [''],

      prn_1: [''],
      prn_2: [''],
      prn_3: [''],
      prn_4: [''],
      prn_5: [''],
      prn_6: [''],
      prn_7: [''],
      prn_8: [''],
      year_2: ['', Validators.required],
      staff: ['', Validators.required],
      month_2: ['', Validators.required],
    });
    this.createMedicalRecords();

Function outside the constructor

  createMedicalRecords() {
    let formID = 44;
    let date = "";
    let key = "6";
    let paging = "100";
    let residentID = this.residentData[23];
    let user = this.user;
    this.loading = this.loadingCtrl.create({content:"Finding Medication for client..."});
    this.loading.present();

   this.mainProvider.searchEntries(user, formID, residentID, key, date, paging)
      .subscribe(data => {
        this.mardetails = data;
        const arr = Object.keys(this.mardetails).map((key) => [key, this.mardetails[key]]);
        this.mardetails = arr[1][1];

        this.current_med = <FormArray>this.entry.controls.medication;
        this.loading.dismiss();

        for(var i = 0; i < this.mardetails.length; i++){
          let record = this.mardetails[i];
          let newRec = this.formBuilder.group({
            medicine: record[9],
            start_date: record[12],
            stop_date: record[13],
            hour_1: record[14],
            hour_2: record[15],
            hour_3: record[16],
            hour_4: record[18],
            physician_name: record[4],
            physician_number: record[5],
            medicine_var: 'medicine' + i,
            hour_1_var : 'hour_1_' + i,
            hour_2_var : 'hour_2_' + i,
            hour_3_var : 'hour_3_' + i,
            hour_4_var : 'hour_4_' + i,
            medicalfg_1: [''],
            medicalfg_2: [''],
            medicalfg_3: [''],
            medicalfg_4: [''],
            medicalfg_5: [''],
            medicalfg_6: [''],
            medicalfg_7: [''],
            medicalfg_8: [''],
            medicalfg_9: [''],
            medicalfg_10: [''],
            medicalfg_11: [''],
            medicalfg_12: [''],
            medicalfg_13: [''],
            medicalfg_14: [''],
            medicalfg_15: [''],
            medicalfg_16: [''],
            medicalfg_17: [''],
            medicalfg_18: [''],
            medicalfg_19: [''],
            medicalfg_20: [''],
            medicalfg_21: [''],
            medicalfg_22: [''],
            medicalfg_23: [''],
            medicalfg_24: [''],
            medicalfg_25: [''],
            medicalfg_26: [''],
            medicalfg_27: [''],
            medicalfg_28: [''],
            medicalfg_29: [''],
            medicalfg_30: [''],
            medicalfg_31: [''],
            medicalfg_1_2: [''],
            medicalfg_2_2: [''],
            medicalfg_3_2: [''],
            medicalfg_4_2: [''],
            medicalfg_5_2: [''],
            medicalfg_6_2: [''],
            medicalfg_7_2: [''],
            medicalfg_8_2: [''],
            medicalfg_9_2: [''],
            medicalfg_10_2: [''],
            medicalfg_11_2: [''],
            medicalfg_12_2: [''],
            medicalfg_13_2: [''],
            medicalfg_14_2: [''],
            medicalfg_15_2: [''],
            medicalfg_16_2: [''],
            medicalfg_17_2: [''],
            medicalfg_18_2: [''],
            medicalfg_19_2: [''],
            medicalfg_20_2: [''],
            medicalfg_21_2: [''],
            medicalfg_22_2: [''],
            medicalfg_23_2: [''],
            medicalfg_24_2: [''],
            medicalfg_25_2: [''],
            medicalfg_26_2: [''],
            medicalfg_27_2: [''],
            medicalfg_28_2: [''],
            medicalfg_29_2: [''],
            medicalfg_30_2: [''],
            medicalfg_31_2: [''],
            medicalfg_1_3: [''],
            medicalfg_2_3: [''],
            medicalfg_3_3: [''],
            medicalfg_4_3: [''],
            medicalfg_5_3: [''],
            medicalfg_6_3: [''],
            medicalfg_7_3: [''],
            medicalfg_8_3: [''],
            medicalfg_9_3: [''],
            medicalfg_10_3: [''],
            medicalfg_11_3: [''],
            medicalfg_12_3: [''],
            medicalfg_13_3: [''],
            medicalfg_14_3: [''],
            medicalfg_15_3: [''],
            medicalfg_16_3: [''],
            medicalfg_17_3: [''],
            medicalfg_18_3: [''],
            medicalfg_19_3: [''],
            medicalfg_20_3: [''],
            medicalfg_21_3: [''],
            medicalfg_22_3: [''],
            medicalfg_23_3: [''],
            medicalfg_24_3: [''],
            medicalfg_25_3: [''],
            medicalfg_26_3: [''],
            medicalfg_27_3: [''],
            medicalfg_28_3: [''],
            medicalfg_29_3: [''],
            medicalfg_30_3: [''],
            medicalfg_31_3: [''],
            medicalfg_1_4: [''],
            medicalfg_2_4: [''],
            medicalfg_3_4: [''],
            medicalfg_4_4: [''],
            medicalfg_5_4: [''],
            medicalfg_6_4: [''],
            medicalfg_7_4: [''],
            medicalfg_8_4: [''],
            medicalfg_9_4: [''],
            medicalfg_10_4: [''],
            medicalfg_11_4: [''],
            medicalfg_12_4: [''],
            medicalfg_13_4: [''],
            medicalfg_14_4: [''],
            medicalfg_15_4: [''],
            medicalfg_16_4: [''],
            medicalfg_17_4: [''],
            medicalfg_18_4: [''],
            medicalfg_19_4: [''],
            medicalfg_20_4: [''],
            medicalfg_21_4: [''],
            medicalfg_22_4: [''],
            medicalfg_23_4: [''],
            medicalfg_24_4: [''],
            medicalfg_25_4: [''],
            medicalfg_26_4: [''],
            medicalfg_27_4: [''],
            medicalfg_28_4: [''],
            medicalfg_29_4: [''],
            medicalfg_30_4: [''],
            medicalfg_31_4: [''],
          });
          this.current_med.push(newRec);
        }
      });
  }

Furthermore, when you check the DevTools in chrome, the iterated <tbody> tags are blinking in purple continuously all the time. Does it mean some function or event is running all the time that causes the form to become sluggish?

HERE:

What could I be doing wrong that’s placing too much load on the form that it can’t even scroll until after several seconds, and can’t allow me to type?

Thank you for your help in advance!!

I have a hard time believing this is the most sustainable way to organize this in the long run, as there are so many hardcoded magic numbers, but that opens up a much larger conversation.

The first simple thing I would recommend is getting rid of all value attributes. It is important to have a single source of truth for forms, and since so many options are provided, it’s easy to end up with more than one. Let formControlName be in charge, and set the value of the FormControl instead of trying to interpolate something using value. I suspect you have a death spiral of bindings fighting over talking to the inputs.

Thanks rapropos for the advice, (Your comments are always on point), thanks!

I have gotten rid of the values and setting them up with the formcontrolnames in the ts file, the form is much faster now but I still can’t enter anything into the ion-input fields, the pointer turns into a cursor but when I click or try to type, nothing happens:

Form

    this.entry = this.formBuilder.group({
      medication: this.formBuilder.array([]),
...

Populating the form with data

  ionViewDidLoad() {
    let formID = 44;
    let date = "";
    let key = "6";
    let paging = "100";
    let residentID = this.residentData[23];
    let user = this.user;
    this.loading = this.loadingCtrl.create({content:"Populating medication for the client..."});
    this.loading.present();

   this.medProvider.searchEntries(user, formID, residentID, key, date, paging)
      .subscribe(data => {
        this.medArray = data;
        const arr = Object.keys(this.medArray).map((key) => [key, this.medArray[key]]);
        this.medArray = arr[1][1];

        this.current_med = <FormArray>this.entry.controls.medication;
        this.loading.dismiss();

        for(var i = 0; i < this.medArray.length; i++){
          let record = this.medArray[i];
          let newRec = this.formBuilder.group({
            'Start Date': record[12],
            'Stop Date': record[13],
            input_one: this.formBuilder.group({
              hour_1: record[14],
              medicine: record[9],
              1: [''],
              2: [''],
              3: [''],
              4: [''],
              5: [''],
              6: [''],
              7: [''],
              8: [''],
              9: [''],
              10: [''],
              11: [''],
              12: [''],
              13: [''],
              14: [''],
              15: [''],
              16: [''],
              17: [''],
              18: [''],
              19: [''],
              20: [''],
              21: [''],
              22: [''],
              23: [''],
              24: [''],
              25: [''],
              26: [''],
              27: [''],
              28: [''],
              29: [''],
              30: [''],
              31: [''],
            }),
            input_two: this.formBuilder.group({
              hour_2: record[15],
              1: [''],
              2: [''],
              3: [''],
              4: [''],
              5: [''],
              6: [''],
              7: [''],
              8: [''],
              9: [''],
              10: [''],
              11: [''],
              12: [''],
              13: [''],
              14: [''],
              15: [''],
              16: [''],
              17: [''],
              18: [''],
              19: [''],
              20: [''],
              21: [''],
              22: [''],
              23: [''],
              24: [''],
              25: [''],
              26: [''],
              27: [''],
              28: [''],
              29: [''],
              30: [''],
              31: [''],
            }),
            input_three: this.formBuilder.group({
              hour_3: record[16],
              1: [''],
              2: [''],
              3: [''],
              4: [''],
              5: [''],
              6: [''],
              7: [''],
              8: [''],
              9: [''],
              10: [''],
              11: [''],
              12: [''],
              13: [''],
              14: [''],
              15: [''],
              16: [''],
              17: [''],
              18: [''],
              19: [''],
              20: [''],
              21: [''],
              22: [''],
              23: [''],
              24: [''],
              25: [''],
              26: [''],
              27: [''],
              28: [''],
              29: [''],
              30: [''],
              31: [''],
            }),
            input_four: this.formBuilder.group({
              hour_4: record[18],
              1: [''],
              2: [''],
              3: [''],
              4: [''],
              5: [''],
              6: [''],
              7: [''],
              8: [''],
              9: [''],
              10: [''],
              11: [''],
              12: [''],
              13: [''],
              14: [''],
              15: [''],
              16: [''],
              17: [''],
              18: [''],
              19: [''],
              20: [''],
              21: [''],
              22: [''],
              23: [''],
              24: [''],
              25: [''],
              26: [''],
              27: [''],
              28: [''],
              29: [''],
              30: [''],
              31: [''],
            }),
          });
          this.current_med.push(newRec);
        }
      });
  }

PART OF HTML Where the looping happens:

           <tbody  class="seizure_item" [formGroupName]="i"  *ngFor="let med of entry.controls.medication.value; let i = index">
          <tr formArrayName="input_one">
          <td rowspan="4"><ion-textarea readonly formControlName="medicine" placeholder="Medication..."></ion-textarea></td>
          <td><ion-input readonly formControlName="hour_1" placeholder="Hour"></ion-input></td>
          <td><ion-input  formControlName="1" placeholder="1" [class]="one" ></ion-input></td>
          <td><ion-input  formControlName="2" placeholder="2" [class]="two" ></ion-input></td>
          <td><ion-input  formControlName="3" placeholder="3" [class]="three" ></ion-input></td>

The CSS is fine, even if i remove all CSS, I still can’t type anything into the ion-inputs. Kindly help!

Thanks.

Figured it out! Took some doing, but thanks for the tip :slight_smile: