Angular Как исправить значение в массиве формы

Я использую Angular8 и реактивные формы. Мой ngOnInit:

ngOnInit(): void {
  this.makeForm = this.fb.group(
    year: ['', Validators.required],
    amount: ['', Validators.required],
    desc: ['', Validators.required],
    details: new FormArray([
      this.det(),
    ]
  );
}

det() {
  return new FormGroup({
    for: new FormControl(''),
    remarks: new FormControl('')
  });
}

У меня есть данные из бэкэнда для исправления массива:

 {
  "amount": 9000,
  "year": 1996,
  "id": 1,
  "desc": "P1",
  "details": [
    {
      "id": 1,
      "remarks": "ok",
      "for": "1"
    },
    {
      "id": 24,
      "remarks": "OK",
      "for": "1"
    },
    {
      "id": 25,
      "remarks": "OK",
      "for": "1"
    }
  ]
 }

Я обычно исправляю значения с помощью этого метода:

getppredit() {
  let data:any = this.shareService.ParentShare.value;
  let id = data.id;
  this.dataService.getdataEdit(id)
    .subscribe((result: any) => {
      let no = result.no;
      let year = result.year;
      this.makeForm.patchValue({
        no: no,
        year: year
      });
  });
}

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

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
6
0
12 513
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Попробуйте вот это

    getppredit(){
      let data:any = this.shareService.ParentShare.value
      let id = data.id 
      this.dataService.getdataEdit(id)
        .subscribe((result: any)  => {
          let no = result.no;
          let year= result.year
          this.makeForm.patchValue({
              no     : no,
              year: year
              })

          //initialize empty array
          this.getFormArray() = new FormArray([]);

          //create needed formGroups and inside each formGroup all formControls
          for (let detail of result.details) {
            
            let idControl: FormControl = new FormControl('');
            let requestForControl: FormControl = new FormControl('');
            let remarkControl: FormControl = new FormControl('');

            idControl.setValue(detail.id);
            ForControl.setValue(detail.requestFor);
            remarkControl.setValue(detail.remark);

            this.getFormArray().push(new FormGroup({
              id: idControl,
              For: requestForControl,
              remark: remarkControl}));
           }

        })//end of subscribe
     
     }
    
        getFormArray(): FormArray{
            return this.makeForm.get('details') as FormArray;
          }

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

Как обнаружить изменение значения в этом запросе?

Gem 14.12.2020 19:57

Как нажать на массив существования @Panagiwths Mpougioukos

Gem 14.12.2020 20:15

@Madhav существующий массив можно переместить в с помощью array.push(). Смотрите мой ответ выше

ChumiestBucket 14.12.2020 21:13

@Madhav, вы используете этот метод, который у меня есть в моем ответе getFormArray(), чтобы получить ссылку на ваш существующий массив, а затем вы используете push для нажатия нового элемента

Panagiotis Bougioukos 14.12.2020 22:50

@Madhav Вы можете использовать, если хотите, чтобы getFormArray().push(dat()) использовал ваш dat(), однако форма, которую вы отправите, будет иметь пустые значения, а не значения из ответа json. Если вы хотите иметь эти значения, вы должны увидеть, что я сделал в ответе.

Panagiotis Bougioukos 14.12.2020 22:56

Да, спасибо, чувак.. Теперь я понял и спасибо. Я получил решение и извлек уроки из него

Gem 15.12.2020 06:55

вот как я бы сделал это, используя FormArray, который отслеживает значение и состояние достоверности массива экземпляров FormControl, FormGroup или FormArray:

export class Component implements OnInit {

  // initialize the FormArray with an empty array!
  formArray: FormArray = new FormArray([]);
  makeForm: FormGroup;

  ngOnInit() {
    this.makeForm = this.fb.group({
      no: ['', Validators.required],
      year: ['', Validators.required],
    });
  }

  getParEdit() {
    ...
    this.dataService.getDataEdit(id).subscribe(result => {
      const { no, year, details } = result;
      this.makeForm.patchValue({ no, year });

      if (details.length) {
        details.forEach(detail => {
          this.formArray.push(
            this.fb.group({
              id: new FormControl({ value: detail.id }),
              requestFor: new FormControl({ value: detail.requestFor }),
              remark: new FormControl({ value: detail.remark }),
            });
          );
        });
      }
    });
  }
}

вы можете динамически создавать FormGroup для каждой итерации detail, а также FormControl в каждой.

Как вставить значение в этот массив? det(){ return new FormGroup({ requestfor : new FormControl(''), примечания: new FormControl(''), // file_id : new FormControl(''), })}

Gem 14.12.2020 19:58

как вставить значение в существующий массив

Gem 14.12.2020 19:59

@Madhav Не уверен, что ты пытаешься спросить. Это не массив, это FormGroup. Пример, который я привел выше, показывает, как вставить FormGroup в FormArray.

ChumiestBucket 14.12.2020 21:11

теперь я понимаю, и спасибо, чувак, и я научился этому

Gem 15.12.2020 06:53

Другие вопросы по теме