Я пытаюсь создать пользовательский MatFormFieldControl, который также реализует ControlValueAccessor.
Я хотел бы начать с известного варианта использования: форма пароля.
План: создать формуполе, которое получает единственную строку, но имеет свою собственную форму, которая добавляет валидацию к полю verifyPassword.
Я создал StackBlitz с работающей реализацией .
Каждый раз, когда вызывается переменная errorState, я проверяю, есть ли несоответствие между этими двумя полями, и обновляю ошибки в ngControl, чтобы они могли отображаться снаружи.
Состояние ошибки сначала отображается правильно,но если вы сопоставляете пароли, а потом снова не совпадаете, выдается эта ошибка:
Error: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'ngIf: null'. Current value: 'ngIf: [object Object]'.
Я не могу найти много документации по этому вопросу в Интернете, и я не уверен, когда это правильное место длядобавить ошибку к объекту ошибок
Кто-нибудь знает, как мне избежать этой ошибки?
заранее спасибо
get errorState() {
const missmatch = this.weightForm.value.password !== this.weightForm.value.confirmPassword;
if (missmatch) {
this.ngControl.control.setErrors({ missmatch }, { emitEvent: false });
}
return (this.ngControl.errors !== null || missmatch) && !!this.ngControl.touched;
}
Идея состоит в том, чтобы создать «разделение интересов», если внешняя форма не знает о verifyPassword, поскольку это скорее поле «Проверка» вместо поля «данные», если это имеет смысл.
Другим примером такого разделения интересов является наличие редактора кода в качестве поля формы, в котором проверки редактора кода отражаются снаружи, не подвергая редактор кода внешнему виду.