Angular ReactiveForm объединить Form.Value для объекта - PullRequest
1 голос
/ 13 марта 2020

Ребята, у меня есть массивная форма, построенная из Angular ReactiveForms, включая вложенный массив с собственным вложенным массивом.

В ngOnInit () я получаю данные из API:

private approval: Approval;

return this.apiService.getApproval(+id).map(data => {
   this.approval = data;
});

Затем я исправляю форму:

this.form.patchValue(this.approval, { emitEvent: false });

, а затем при вызове SUBMIT

private onSubmit() {

  Object.assign(this.approval, this.form.value);

  return this.apiService.updateApproval(this.approval).map(data => {
  });

}

API, к которому я подключаюсь, требует, чтобы полный объект был POST-ed, а не просто изменялся (PATCH не реализована). Поэтому я не могу использовать this.form.value, но мне нужно отправить полный объект.

Я ищу что-то похожее на .NET / C# AutoMapper. Код выше - Object.assign - делает то, что мне нужно для свойств первого уровня. Примитивные типы обновляются, однако свойства, такие как массивы или объекты, игнорируются.

Есть ли какой-нибудь рекомендуемый путь * Angular, как с этим бороться? Спасибо!

РЕДАКТИРОВАТЬ: кажется, что массивы перезаписаны. У объектов в массиве обновленные значения, но некоторые свойства исходного объекта, отсутствующие в форме, отсутствуют.

1 Ответ

1 голос
/ 14 марта 2020

Одним из вариантов является использование Loda sh слияния :

var object = {
  'a': [{ 'b': 2 }, { 'd': 4 }]
};

var other = {
  'a': [{ 'c': 3 }, { 'e': 5 }]
};

_.merge(object, other);
// => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }

Посмотрите на Как глубокое слияние вместо мелкого слияния для других вариантов тоже.

...