Проблема в том, что добавить новые значения в новые ключи или индексы невозможно без знания типа AbstractControl
, который вы хотите внутри FormArray
в новом индексе.
Любое решение должно занятьучитывать, должен ли этот индекс быть FormControl
, FormGroup
или FormArray
, следовательно, параметр toSubControl
, который я предлагаю в моей функции setFormArrayValue
. (Я также приведу несколько примеров значений для этого параметра.)
Я решил удалить все элементы, а затем добавить новые элементы управления для каждого значения. Попытка сохранить уже существующие элементы управления приводила к странному поведению.
Вот решение, которое я придумала:
type ControlFactory<T> = (values: T) => AbstractControl;
export function setFormArrayValue<T>(
array: FormArray,
values: T[],
toSubControl: ControlFactory<T> = toFormControl
) {
while (array.length) {
array.removeAt(0);
}
values
.map(toSubControl)
.forEach(function(control) {
array.push(control);
});
return array;
}
Где следующие функции могут создать нового потомка AbstractControl
s.
// When the child controls should be FormControl
function toFormControl<T>(value: T) {
return new FormControl(value)
}
// When the child controls should be FormGroup
function toFormGroup<T>(item: T) {
const fields = Object.entries(item).reduce(function(hash, [key, value]) {
hash[key] = new FormControl(value);
return hash;
}, {});
return new FormGroup(fields);
}
// When the child controls should be FormArray of FormControls
function toFormArray<T>(values: T) {
const fields = values.map(value => new FormControl(value));
return new FormGroup(fields);
}