У меня есть Formgroup с Formarray внутри.
Это структура:
myForm = this.fb.group(
{
title: ["", [Validators.required, Validators.minLength(4)]],
pairs: this.fb.array(
this.fPairs.map(f =>
this.fb.group({
grade: [],
value: []
})
)
)
}
);
мой FormArray, который отображается, выглядит следующим образом onInit:
fPairs: Array<pairs> = [
{grade: 0, value: 0},
{grade: 0, value: 0},
{grade: 0, value: 0},
{grade: 0, value: 0}
];
Чего я хочу достичь, так как каждое свойство каждого объекта этого FormArray является полем ввода в моей форме, мне нужна проверка, которая делает это:
Свойства объекта в индексе 0, должны иметь значения BIGGERчем следующий индекс.
, поэтому в myForm
,
pairs[0].score > pairs[1].score
pairs[1].score > pairs[2].score
pairs[2].score > pairs[3].score
то же самое относится и к свойству "value".
Как правильно реализовать реальный валидатор (введите ValidatorFn
) для этого formArray
?
Пока мне удалось создать только функцию, которая проверяет каждое поле, сравнивает его с предыдущим и следующим, если значения не соответствуют правилам, я вручную устанавливаю ошибку с setErrors()
Эта функция находится в подписке ValueChanges()
, поэтому, когда значение в этом formArray
изменяется, она проверяет его с моей функцией
Есть ли лучший способ?
Здесьstackblizt (подписка valueChanges
не работает должным образом, она будет обновляться только при записи в следующем поле, вы увидите, что я имею в виду в stackblitz)
https://stackblitz.com/edit/angular-mat-formfield-flex-layout-x9nksb
спасибо