Элемент обновления Angular / TypeScript массива объектов - PullRequest
0 голосов
/ 01 мая 2020

пожалуйста, прости, если мой вопрос глуп, но я понятия не имею, что я делаю не так. У меня есть массив объектов

export interface IOptionsData {
  option: string;
  optionPrice: number;
  benefit: string;
  benefitPrice: number;
  oneshotPrice: number;
  commitmentPeriod: number;
}

formData: IOptionsData[] = [];

и сохранение данных из формы в нем

onOptionChange(i) {
    console.log(i);
    console.log(this.productForm.controls['user_options']);
    this.formData[i].option = this.productForm.controls['user_options'].value[i].option;
    this.formData[i].commitmentPeriod = this.productForm.controls['user_options'].value[i].commitmentPeriod;
    console.log(this.formData);
    ...
  }

На первом элементе все кажется нормальным

Мои данные формы:

Form data 1

И данные моего массива:

Array data 1

Но когда я обновляю другой элемент в форма, вместо обновления этого элемента в массиве, он обновляет полный массив до этих значений

Form data 2

Array data 2

Функция onChange вызывается с правильным параметром, множественные вызовы функций отсутствуют

Не представляю, почему это происходит

Пожалуйста, если вам известна какая-либо причина, по которой это будет

Спасибо

РЕДАКТИРОВАТЬ: забыл упомянуть

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

  selectedOptions: string[] = [];
  selectedBenefits: string[] = [];
  selectedPrices: number[] = [];
  benefitPrices: number[] = [];
  oneshotBenefitPrices: number[] = [];

И то же обновление работает, как и предполагалось, обновляется только обновленное значение

this.selectedOptions[i] = this.productForm.controls['user_options'].value[i].option;

РЕДАКТИРОВАТЬ №2:

Для воспроизведения этой ошибки вам не нужно html template.

Вот часть .ts файла

export interface IOptionsData {
  option: string;
  optionPrice: number;
  benefit: string;
  benefitPrice: number;
  oneshotPrice: number;
  commitmentPeriod: number;
}

demoOptionsData: IOptionsData = { option: null, optionPrice: 0, benefit: null, benefitPrice: 0, oneshotPrice: 0, commitmentPeriod: 24 };
ngOnInit() {
  /* Initiate the form structure */
    this.formData.push(this.demoOptionsData);
    this.formData.push(this.demoOptionsData);
    this.formData.push(this.demoOptionsData);

    this.formData[1].option = 'TEST';
    console.log(this.formData);
  }

Array data 3

1 Ответ

0 голосов
/ 02 мая 2020

Решено с помощью комментария от @htn. FormData - это массив ОДНОЙ ИМЕЮЩЕЙСЯ ССЫЛКИ demoOptionsData, поэтому ожидаемый результат

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...