Объединение Angular FormBuilder с асинхронным кодом (Observables)

У меня есть массив Observables, который я показываю через асинхронный канал Angular в форме. Массив devices$ динамический, я добавляю в него элементы по нажатию кнопки.

<form [formGroup]="devices_form" (ngSubmit)="submitForm()">
   <div *ngFor="let device of devices$">
      <div *ngIf="device | async as device">
        <input value="{{ device.name }}">
        <input value="{{ device.type }}">
      </div>
    </div>
</form>

Теперь мне нужно отправить данные (name и т.д.) devices$ через Angular FormBuilder. Думаю, мне нужно сначала отобразить/перебрать массив devices$, подписаться на его элементы и отправить результаты в поле FormGroup.

Хотя я сбит с толку, потому что мои Observables, конечно, асинхронны, и при отправке формы я должен убедиться, что мои данные полны, если это имеет смысл. До сих пор я не подписывался вручную на Observables в своем коде TypeScript.

Вот мой упрощенный код:

// Interface of device
export interface Device {
 name: string,
 type: string
}

// Devices form I need to submit
this.devices_form = this.formBuilder.group({
   devices: ['', Validators.required]
});

// Submit form if valid
submitForm() {

   // I guess I need to set the devices value here
   this.devices_form.get('devices').setValue('array data here...');

   if (this.devices_form.valid) {
      this.saveData(this.devices_form.value);
   }
}

Я уже пробовал отображать devices$, подписываясь на его элементы и добавляя это в FormGroup. Хотя, поскольку это асинхронные данные, они не работали должным образом (поскольку подписка никогда не «заканчивается», я не получил правильное количество элементов). Я также играл с FormArray (из Angular), но безуспешно.

Кто-нибудь знает, как объединить асинхронный код с массивом Observables и Angular FormBuilder?

Заранее спасибо!


person Kheber    schedule 30.04.2021    source источник
comment
Может быть проще, если у вас есть наблюдаемый массив вместо массива наблюдаемых. (Может быть даже оператор RxJS, который делает это преобразование.)   -  person ekalin    schedule 30.04.2021
comment
@ekalin это правда, но, к сожалению, все, что у меня есть, это массив наблюдаемых, и я не могу это изменить. В противном случае операторы RxJS были бы вариантом.   -  person Kheber    schedule 03.05.2021
comment
Возможно, здесь может помочь одно из решений: массив наблюдаемых"> stackoverflow.com/questions/47972512/   -  person ekalin    schedule 03.05.2021