У меня есть некоторые компоненты формы, которые на самом деле просто оборачивают некоторые части большого формуляра на маленькие кусочки. Я могу представить себе два способа сделать это: ControlValueAccessor или простую привязку PropertyBinding для передачи FormControl в подкомпонент.
Супер-простой пример https://stackblitz.com/edit/angular-dt6pva
Основные идеи:
...
providers: [
{
provide: NG_VALUE_ACCESSOR,
multi: true,
useExisting: forwardRef(() => Input01Component)
}
]
})
export class Input01Component implements ControlValueAccessor {
...
vs.
...
@Input()
control = new FormControl();
...
ControlValueAccessor-way кажется немного более "правильным", но также и более "рабочим".
Вопрос: есть ли аспекты / преимущества / недостатки при использовании более простого FormControl-Input-Binding?
ИЗМЕНИТЬ
Подумайте об этой структуре json, которая должна быть оформлена как форма
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"email": "[email protected]",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough",
"company": {
"name": "Romaguera-Crona",
"catchPhrase": "Multi-layered client-server neural-net",
"bs": "harness real-time e-markets"
}
Я бы определил 3 компонента: PersonForm, AdressForm, CompanyForm.
преимущества / недостатки, которые приходят мне в голову, кто-то может добавить некоторые моменты, которых я не видел:
FormControl-ввод
- ++ более простые подкомпоненты
- - разные свойства для использования (я не могу повторно использовать formControl / formControlName)
ControlValueAccessor
- ++ такое же использование, как и все другие входные компоненты (formControlName)
- - «больше работы» для реализации
- ?? разбить большую форму определений. С одной стороны, создание небольших компонентов - это вообще хороший момент, и я могу повторно использовать компоненты формы. С другой стороны, я "теряю" общий вид структуры данных, которая может быть отправлена непосредственно в оставшийся сервер:
peronForm = new FormGroup({
id: new FormControl(),
name: new FormControl(),
username: new FormControl(),
email: new FormControl(),
address: new FormControl(), //>> handled by AdressComponent
company: new FormControl() //>> handled by CompanyComponent
});
До сих пор: не уверен, хорошо это или плохо :)
Спасибо за помощь