Как определить, допустима ли форма дочернего компонента в родительском компоненте при использовании реактивных форм
Я использую Angular 5 с реактивными формами
Класс дочернего компонента:
export class UserEditor implements OnInit {
public userForm: FormGroup;
...
ngOnInit() {
this.createFormControls();
this.createForm();
}
createFormControls() {
this.userName = new FormControl('', [
Validators.required,
Validators.minLength(4)
]);
this.firstName = new FormControl('', Validators.required);
this.lastName = new FormControl('', Validators.required);
this.email = new FormControl('', [
Validators.required,
Validators.pattern("[^ @]*@[^ @]*")
]);
}
createForm() {
this.userForm = new FormGroup({
userName: this.userName,
name: new FormGroup({
firstName: this.firstName,
lastName: this.lastName,
}),
email: this.email,
});
}
В форме родительского компонента у меня есть кнопки, которые отключены, если вышеуказанные валидаторы недействительны
В родительском компоненте html:
<button class="btn btn-sm btn-primary" (click)="saveUser()" [disabled]="!userListChild?.userForm.valid">
В классе родительского компонента:
export class UserList implements OnInit {
@ViewChild(UserEditor) userListChild: UserEditor;
Все работает хорошо, но я получаю известную ошибку
ExpressionChangedAfterItHasBeenCheckedError: Выражение изменилось после его проверки. Предыдущее значение: "true". Текущее значение: "ложь
Я попробовал решение для обнаружения изменений, указанное в этом блоге, но оно не помогло.
Так что я застрял, если только я игнорирую ошибку, так как приложение работает нормально с ошибкой.
1 ответ
Я делаю ответ, чтобы перечислить несколько решений:
1 - Попробуйте заменить ngOnInit
с ngAfterViewChecked
2 - В вашем ngOnInit
попробуйте добавить setTimeout(() => /* calls */)
где вы положили оба вызова метода в тайм-аут
Было бы действительно проще, если бы вы использовали эту библиотеку https://github.com/cloudnc/ngx-sub-form
Я ответил на очень похожий ответ, чем этот здесь /questions/442332/angular-2-obrabotka-bolshih-zayavok/49364013#49364013 поэтому я не думаю, что было бы целесообразно предоставлять немного больше кода, чем там.
Пожалуйста, также проверьте демонстрацию, которую я сделал для этого ответа здесь https://stackblitz.com/edit/so-question-angular-2-large-scale-application-forms-handling где вы сможете увидеть нечто подобное как ваша структура
Заметьте часть ошибок? Из родительского компонента вы получите доступ к нему и сможете увидеть, что не так в вашей форме, даже если у вас есть подформы!