Скажем, у меня есть форма оформления заказа, которая содержит компонент дочернего адреса следующим образом
<form [formGroup]="checkoutForm">
<input formControlName="fullName">
/** more inputs **/
<address-form></address-form>
<button type="submit">Submit</button>
</form>
На данный момент у меня есть checkoutForm, подобный:
this.checkoutForm = this.formBuilder.group({
fullName: ['', Validators.required]
});
Шаблон addressForm выглядит так:
<form [formGroup]="addressForm">
<input formControlName="street">
<input formControlName="town"
</form>
И построен как:
this.addressForm = this.formBuilder.group({
street: ['', [Validators.required]],
town: ['', Validators.required]
});
Теперь у меня есть проблема: я не знаю, как
1 - Проверяйте родительскую форму, только если дочерняя форма действительна.
2 - Проверяйте дочернюю форму при отправке родительской формы.
Единственный способ, которым я мог думать об этом, - это иметь @Output() addressResponse
, который будет излучать this.addressForm.valueChanges
с достоверностью и данными. Что-то вроде:
this.addressForm.valueChanges.subscribe(data => {
let form = this.addressForm.valid ?
{ valid: true, value: data }:
{ valid: false, value: data };
this.addressResponse.emit(form);
});
И компонент родительской формы может использовать эти переданные данные.
А также есть @Input() parentFormSubmitted
, который я могу использовать для отображения ошибок в шаблоне AddressForm
<input formControlName="town"
<div *ngIf="town.hasError('required') && (parentFormSubmitted || town.dirty">Town is a required field</div>
Хотя это сработает, я не уверен, что это оптимальное решение. Мне было интересно, есть ли способ сделать что-то более реактивным. (Может быть, включить группу AddressForm в определение группы CheckoutForm? ...)