Angular: показывать сообщение проверки реактивной формы с помощью 'form.errors' или '! Form.valid'

Я использовал реактивную форму в своем проекте Angular во многих местах, и на прошлой неделе мы решили немного оптимизировать наш код. Во время проверки кода я обнаружил проблему с отображением сообщений проверки формы в HTML.

Поэтому я использовал приведенный ниже код, чтобы показать сообщения об ошибках проверки:

<form [formGroup] = "form">
  <div>
    <input formControlName = "firstName">
    <div *ngIf = "form.controls.firstName.errors && (form.controls.firstName.touched || form.controls.firstName.dirty)">
        This field is required
    </div>
  </div>
</form>

Вроде нормально, но что, если я заменю form.controls.firstName.errors на !form.controls.firstName.valid См. Ниже:

<form [formGroup] = "form">
  <div>
    <input formControlName = "firstName">
    <div *ngIf = "!form.controls.firstName.valid && (form.controls.firstName.touched || form.controls.firstName.dirty)">
        This field is required
    </div>
  </div>
</form>

Я не заметил никакой разницы, но в моей команде некоторые товарищи по команде придерживаются мнения, что мы должны использовать !form.controls.firstName.valid, и мы долго обсуждали этот небольшой вопрос. Я все еще не убедил своих товарищей по команде. Для меня, если у form есть error, тогда его статус будет invalid или form будет invalid, потому что у него есть error.

Может ли кто-нибудь подсказать мне, какой вариант нам следует придерживаться, и он в принципе правильный.

Спасибо заранее.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Функция валидатора будет возвращать объектный литерал ошибок, если есть ошибка, или null в противном случае. Ложность результата заключается в том, как angular know определяет, действителен ли элемент управления. Таким образом, вы можете предположить, что результат будет функционально эквивалентным, если вы используете .error или !...valid.

Сказанное использование !...valid (или, точнее, .invalid) является более определенным подходом, и если вы посмотрите на Примеры Angular, вот как они это делают.

Я смотрю на это так: кто знает, будет ли поведение, от которого вы зависите, всегда одинаковым? В будущем может быть законный случай, когда ошибка равна нулю, но элемент управления по-прежнему недействителен. Лучше всего использовать наиболее явный подход, когда это не требует дополнительных затрат.

РЕДАКТИРОВАТЬ

На самом деле посмотрите на источник AbstractControl, потенциально ошибки могут быть пустыми, но элемент управления все еще может быть недействительным в зависимости от реализации функции _anyControls():

get invalid(): boolean { return this.status === INVALID; }

/*...*/

private _calculateStatus(): string {
  if (this._allControlsDisabled()) return DISABLED;
  if (this.errors) return INVALID;
  if (this._anyControlsHaveStatus(PENDING)) return PENDING;
  /* if the condition below is true that means the control will be invalid
   * but errors will be null. */
  if (this._anyControlsHaveStatus(INVALID)) return INVALID;
  return VALID;
}

Учитывая, что возможны условия, при которых errors может быть нулевым, но статус управления по-прежнему будет invalid, тогда вам определенно следует проверять invalid, а не errors.

Спасибо за ответ, Даниэль. Я убежден в последней части вашего ответа: «Лучше всего использовать наиболее явный подход, когда это не требует дополнительных затрат». Поскольку наш проект большой, я был немного сбит с толку.

tutorialfeed 11.10.2018 21:22

Возможно, вы захотите увидеть мой обновленный ответ. Вы обязательно должны использовать invalid.

Daniel Gimenez 11.10.2018 21:32

Ух ты, здорово. Действительно сенсационное сообщение. Я не уделял особого внимания. Цените ваши усилия. Спасибо!

tutorialfeed 11.10.2018 21:42

Другие вопросы по теме