#angular #angular-forms
#angular #угловые формы
Вопрос:
В моем приложении Angular у меня есть некоторые входные данные, подключенные к FormControl. Когда я удаляю обычное поле ввода, если я проверяю значение в соответствующем FormControl, у меня есть ''
.
Это проблема, потому что серверу требуется null
значение вместо ''
, поэтому на данный момент у меня есть метод в службе, который перестраивает мой объект, помещая null
значение на ''
место.
Итак, есть ли способ сделать это в лучшем режиме? Какова наилучшая практика в этом случае?
Ответ №1:
Простым способом было бы подписаться на изменения значения элемента управления формой, реагировать на случаи, когда значение является пустой строкой, а затем установить значение в null
. Упрощенный пример:
import {Component} from '@angular/core';
import {FormControl} from '@angular/forms';
@Component({
template: `
<input type="text" [formControl]="formControl"><br/>
Current value: {{ formControl.value |json }}
`
})
export class FormComponent {
formControl = new FormControl();
constructor() {
this.formControl.valueChanges.subscribe(value => {
if (value === '') {
this.formControl.patchValue(null);
}
});
}
}
Конечно, это зависит от вашего варианта использования, если это действительно выполнимо. Если у вас много элементов управления формой, которыми вы не можете управлять централизованно, вам может потребоваться придумать другое решение.
Что-то немного более сложное, но выполнимо, это добавить перехватчик HTTP, который заменяет пустые строки на null
в ваших телах запросов, отправляемых на ваш сервер.
Комментарии:
1. Спасибо, да, это хороший способ. В моем случае у меня обычно есть FormGroup и FormArray, есть ли способ это сделать?
2. Это не плохая идея. Вы заставляете Angular выполнять проверку каждого изменения
3. @Eliseo Я не вижу, чтобы это происходило. Он просто добавляет еще один цикл обнаружения изменений (один раз, когда
patchValue(null)
выдается, и все.
Ответ №2:
Мой подход — другой. Обычно вы отправляете данные в службу, поэтому в службе, где вы проверяете значения. например
saveData(data:any)
{
data.name=data.name ||null
data.address.address2=data.address.address2 || null
....
data.myarrayOfFormGroup.forEach(x=>{
x.value=x.value|| null
})
data.myArrayOfFormControls=data.myarrayOfFormControl.map(x=>x||null)
this.httpClient.pos("...",data)
}