Я бы выбрал немного другой подход и не использовал бы ControlValueAccessor
, а вместо этого "обычный" дочерний компонент и использовал бы ControlContainer
, тогда вы можете пропустить все эти markAsTouched
вещи, так как родитель будет знать о происходящемon in child.
parent:
this.form = this.formBuilder.group({});
template:
<app-login-form></app-login-form>
Дочерний компонент, в который мы добавляем formcontrols к существующей родительской форме:
@Component({
selector: "app-login-form",
templateUrl: "./login-form.component.html",
styleUrls: ["./login-form.component.css"],
viewProviders: [
{
provide: ControlContainer,
useExisting: FormGroupDirective
}
]
})
export class LoginFormComponent implements OnInit {
childForm: FormGroupDirective;
constructor(
parentForm: FormGroupDirective,
private fb: FormBuilder
) {
this.childForm = parentForm;
}
ngOnInit() {
this.childForm.form.addControl('username', this.fb.control('', [Validators.required]));
this.childForm.form.addControl('password', this.fb.control('', [Validators.required]));
}
}
Тогда в шаблоне вы просто используете formControlName
вместо [formControl]
, например:
<input matInput formControlName="username">
<mat-error *ngIf="childForm.hasError('required', 'username')">Required</mat-error>
Также удалите теги формы у дочернего элемента, а также не забудьте добавить type="button"
в иконку, в противном случаеКнопка будет считаться submit
.
Из родительской формы отправки вы можете удалить: control.markAllAsTouched();
Я бы разбудил ваш стек с полным кодом, но похоже, что я 'Мне не разрешено его раскошелиться. Надеюсь, я не забуду упомянуть все внесенные мной изменения, в противном случае, пожалуйста, предоставьте стек, который можно разветвить.