Как я могу динамически создавать и исправлять значение поля выбора в реактивной форме Angular?

Я создал реактивную форму Angular. У меня есть поле выбора, которое я динамически заполняю значениями, возвращаемыми из вызова API.

Я также смог исправить значение моих полей формы.

Я пытаюсь динамически создать поле выбора и исправить значение на том же шаге.

Я пробовал различные комбинации создания элементов управления формы и patchValue безрезультатно.

Первое, что я делаю, это вызываю конечную точку API и обрабатываю возвращенный объект массива.

// The API returns an array of items
elTimecard.timecardDets.forEach((elTimecardDets, i) => {
    // Code dynamically creates the form control fields
    this.addWorkTracked(elTimecardDets);
});

Как показано в вышеупомянутом коде, я перебираю возвращенный массив, чтобы создать поля управления формой.

// Adds a row of form controls to the form array to track items worked.
// Parameter is optional so that the method can be used to create an empty row of form control fields
addWorkTracked(data?: ITimecardDet): void {
  // Push the new form control fields to the array
  this.timecardDets.push(this.buildWorkTracked(data));
}

Затем я создаю фактические элементы управления формой

buildWorkTracked(data?: ITimecardDet): FormGroup {
    if (data) {
      // This code should dynamically create the new row of form control
      // fields and set the values based upon the data values passed 
      // through via the API call
      return new FormGroup({
        payCategory: new FormControl(this.buildPayCategories()),
        shiftDifferential: new FormControl(
          this.buildShiftDifferentialCategories()
        ),
        overtimeCategory: new FormControl(this.buildOvertimeCategories()),
        hoursWorked: new FormControl(data.hours),
        earnings: new FormControl({
          value: (this.baseRate * data.hours).toFixed(2),
          disabled: true
        })
      });
    } else {
      // Create a new row of 'clean' form control fields
      return new FormGroup({
        payCategory: new FormControl(this.buildPayCategories()),
        shiftDifferential: new FormControl(
          this.buildShiftDifferentialCategories()
        ),
        overtimeCategory: new FormControl(this.buildOvertimeCategories()),
        hoursWorked: new FormControl('0:00'),
        earnings: new FormControl({ value: null, disabled: true })
      });
    }
  }
// Code that builds the select options
buildPayCategories() {
    this.payCategories = this.timeEntry.payCategories;
    return this.payCategories;
}

Вот HTML, если нужно

<select
    matNativeControl
    formControlName="payCategory"
    id="{{ payCategory + i }}">
    <option
        *ngFor="
        let payCategory of payCategories;
        let payCategoryIndex = index"
        [ngValue]="payCategoryIndex">
            {{ payCategory.description }}
    </option>
</select>

Я хотел бы, чтобы первый раздел моего предложения if, который получает данные, динамически создавал поля выбора управления формой и устанавливал выбранное значение на основе значения данных.

Например, если данные возвращают 1, а у меня есть четыре элемента (со значениями 0, 1, 2, 3) в раскрывающемся списке выбора, я хочу, чтобы был выбран второй элемент, поскольку он был возвращен из вызова API.


person Clay Hess    schedule 04.05.2019    source источник
comment
buildPayCategories что это?   -  person Antoniossss    schedule 04.05.2019
comment
Извините... забыл этот кусок. Я отредактировал, чтобы включить его. Все, что он делает, это создает параметры поля выбора.   -  person Clay Hess    schedule 04.05.2019
comment
FromControll принимает (выбранное) значение в качестве аргумента конструктора, а не массив опций. Если payCategories не является одиночным значением, а не массивом, это неправильно.   -  person Antoniossss    schedule 04.05.2019


Ответы (1)


Я придумал решение. Не стесняйтесь предложить лучший. Я изменил свой метод buildWorkTracked следующим образом...

buildWorkTracked(data?: ITimecardDet): FormGroup {
    // If data was provided, dynamically create the form controls stored in const
    // Provide values from data param for inputs
    if (data) {
      const buildTimecardDetsLineItem = new FormGroup({
        payCategory: new FormControl(this.buildPayCategories()),
        shiftDifferential: new FormControl(
          this.buildShiftDifferentialCategories()
        ),
        overtimeCategory: new FormControl(this.buildOvertimeCategories()),
        hoursWorked: new FormControl(data.hours),
        earnings: new FormControl({
          value: (data.baserate * data.hours).toFixed(2),
          disabled: true
        })
      });
      // Patch form array to set selected values based off of data param
      buildTimecardDetsLineItem.patchValue({
        payCategory: data.paycatinc,
        shiftDifferential: data.shiftDifferentialTypeId,
        overtimeCategory: data.overtimeTypeId
      });
      // Return const
      return buildTimecardDetsLineItem;
    } else {
      // If no data provided, create blank form array for end user entry
      return new FormGroup({
        payCategory: new FormControl(this.buildPayCategories()),
        shiftDifferential: new FormControl(
          this.buildShiftDifferentialCategories()
        ),
        overtimeCategory: new FormControl(this.buildOvertimeCategories()),
        hoursWorked: new FormControl('0:00'),
        earnings: new FormControl({ value: null, disabled: true })
      });
    }
  }
person Clay Hess    schedule 04.05.2019