Как правильно обрабатывать ошибки для пользовательского сообщения?

Я пишу функцию, которая проверяет ошибки, а затем использую ngIf для отображения (или нет) пользовательского текста. Сюда:

// ts
handleError = (controlName: string, errorName: string) => {
    return this.form.controls[controlName].hasError(errorName);
}

// html
<mat-error *ngIf = "handleError('tipo', 'required')">Campo obbligatorio</mat-error>

Это хорошо работает для "одноуровневой" группы форм. А как насчет группы вложенных форм? Такие как:

this.form = this.fb.group({
    field1: [data.field1, [Validators.required]],
    myObj: this.fb.group({
        field2: [data.myObj.field2, [Validators.required]],
    })
});

Здесь он кажется аварийным (говоря Не удается прочитать свойства неопределенного (чтение «hasError») на консоли).

Каков наилучший подход к повторению любой вложенной группы форм и проверке на наличие ошибок?

Тестирование функциональных 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
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Используйте метод получить для извлечения элемента управления, чтобы вы могли передать значение с разделителями точками для доступа к вложенному элементу управления формой.

компонент.ts

handleError = (controlName: string, errorName: string) => {
    return this.form.get(controlName).hasError(errorName);
}

компонент.html

<mat-error *ngIf = "handleError('myObj.field2', 'required')">Campo obbligatorio</mat-error>

Что делать, если я нахожусь в FormArray? Что дискриминировать по индексу? Не могу сделать myObj.item[x].field :(

markzzz 18.03.2022 16:10

Вы также можете получить доступ к FormArray ['formGroupKey', ArrayIndex,] ==> handleError (['myObj', 0], 'required') что-то вроде

Chellappan வ 18.03.2022 16:17

Вы используете строку с разделителями точками или документацию по проверке массива: angular.io/api/forms/AbstractControl#get

Chellappan வ 18.03.2022 16:18

Попробовал ваше предложение: <mat-error *ngIf = "handleError('ingredienti.[farine,itemIndex].quantita'‌​, 'required')">Campo obbligatorio</mat-error> но это ошибка

markzzz 19.03.2022 10:05

какую ошибку вы получаете?

Chellappan வ 19.03.2022 14:56

он говорит: «ОШИБКА TypeError: невозможно прочитать свойства null (чтение« hasError »)»

markzzz 21.03.2022 08:30

Это означает, что вы можете передать неправильный аргумент, можете ли вы создать небольшой stackbkitz>

Chellappan வ 21.03.2022 09:35

Я следую вашему предложению. Вот функция: handleError = (controlName: string, errorName: string) => { return this.form.get(controlName).hasError(errorName); }

markzzz 21.03.2022 10:14

Я сделал пример, пожалуйста, проверьте: stackblitz.com/edit/angular-ivy-a1bxoa?file=src/app/…

Chellappan வ 21.03.2022 10:29

Я добавил еще один уровень, что касается «ингредиенти», из вашего примера: stackblitz.com/edit/angular-ivy-ffltbg?file=src/app/… . кажется, выдает ту же самую ошибку...

markzzz 21.03.2022 11:55

При использовании массива вы должны передавать каждый уровень в виде отдельной строки примерно так: console.info(this.handleError(['anotherLevel','arr', 0], 'required'));

Chellappan வ 21.03.2022 12:31

Да, но я нахожусь в компоненте на html-странице. Он вложен на других уровнях, поэтому мне нужно пройти весь путь; иначе как мне поймать элемент? относится к моему предыдущему коду: <mat-error *ngIf = "handleError('anotherLevel.[farine,itemIndex].name', 'required')">Campo obbligatorio</mat-error>

markzzz 21.03.2022 12:43

Разве вы не можете передать каждой группе форм/ключу управления что-то вроде ['anotherLevel','farine',itemIndex,'name']?

Chellappan வ 21.03.2022 12:49

Сюда? <mat-error *ngIf = "handleError('[anotherLevel,farine,itemIndex.name]', 'required')">Campo obbligatorio</mat-error>? У меня такая же ошибка...

markzzz 21.03.2022 13:47

На самом деле вы передаете массив строк, это должен быть массив внутри строки или числа handleError(['anotherLevel','farine',itemIndex.name]', 'required')"

Chellappan வ 21.03.2022 13:49

Теперь так: handleError(['anotherLevel','farine',itemIndex,'quantita'], 'required')" он говорит "core.mjs:6485 ERROR Код ошибки: undefined Сообщение: Преобразование циклической структуры в JSON"

markzzz 21.03.2022 14:17

Пожалуйста, создайте stackblitz.

Chellappan வ 21.03.2022 17:40

Не очень хорош в stackblitz. Вот моя попытка с моим кодом: stackblitz.com/edit/angular-ivy-n1xuir?file=src/app/… (даже если он делает ошибки, не знаю почему, но я думаю, что это не связано с моим кодом?)

markzzz 22.03.2022 08:53
stackblitz.com/edit/angular-ivy-nm48u8?file=src/app/… , я сделал некоторые изменения в html, все работает нормально
Chellappan வ 22.03.2022 10:17

Я понимаю. Я думаю, что это больше связано с тем, как я добавляю новый элемент формы. Что касается этого вопроса: stackoverflow.com/questions/71537428/…. Может быть, это неправильный путь? Я принял этот ответ как «Правильный». Можете помочь с другим вопросом?

markzzz 22.03.2022 11:37

Конечно. Я сделаю все возможное.

Chellappan வ 22.03.2022 11:42

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