FormArray возвращается как FormControl вместо FormArray - PullRequest
0 голосов
/ 31 октября 2019

У меня проблемы с вложенными FormArrays в угловых реактивных формах. Один из моих массивов форм правильно возвращается как FormArray, а другой возвращается как FormControl. В функции initialMaterials () у меня есть два console.logs. console.log(control) возвращает элемент FormControl, а console.log(this.objectServiceJobsArray) возвращает FormArray.

Мне нужно иметь возможность добавлять материалы к определенным заданиям в массиве и при необходимости изменять их в форме.

this.objectServiceForm = this.formBuilder.group({
          onHolidays: [this.objectService.onHolidays],
          objectServiceJobs: this.formBuilder.array([this.objectServiceJobs()]),
          isBillable: [this.objectService.isBillable],
          defaultPrice: [this.objectService.defaultPrice],
          pricePerHour: [this.objectService.pricePerHour],
          doneWeekly: [this.doneWeekly],
        });

objectServiceJobs(): FormGroup {
    return this.formBuilder.group({
      job: [''],
      workDetail: [''],
      competentWorkers: [[]],
      materials: this.formBuilder.array([this.objectServiceJobMaterials()])
    });
}

objectServiceJobMaterials(): FormGroup {
    return this.formBuilder.group({
      material: [null],
      quantity: [null]
    });
}

initialMaterials(job) {
    const index = (<FormArray>this.objectServiceForm.get('objectServiceJobs')).controls.findIndex(x => x.value.job.id === job.id);
    const control = (<FormArray>this.objectServiceForm.controls['objectServiceJobs']).at(index).get('materials') as FormArray;
    console.log(control);
    console.log(this.objectServiceJobsArray);

    // job.materials.forEach(mat => {
    //   this.objectServiceJobsArray[index].materials.push(this.makeMaterialFormGroup(mat));
    // });
}

Ответы [ 2 ]

2 голосов
/ 31 октября 2019

Я попробовал ваш код в моей IDE, но изменил стиль извлечения элементов управления, и я вижу, что console.log (control) возвращает меня как FormArray.

initialMaterials(job) {
    const objectServiceJobs = this.objectServiceForm.get('objectServiceJobs') as FormArray;
    const index = objectServiceJobs.controls.findIndex(x => x.value.job.id === job.id);
    const control = objectServiceJobs.at(index).get('materials') as FormArray;
    console.log(control);
  }
1 голос
/ 31 октября 2019

Как сказал saloo, код работает отлично и возвращает FormArray, просто имейте в виду, что задание является элементом управления формы (значение не является объектом), поэтому x.value.job.id всегда не определено внутри этой строки:

const index = objectServiceJobs.controls.findIndex(x => x.value.job.id === job.id);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...