У меня есть 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 должны иметь БОЛЬШИЕ значения, чем следующий индекс.
so in myForm
,
pairs[0].score > pairs[1].score
pairs[1].score > pairs[2].score
pairs[2].score > pairs[3].score
то же самое касается свойства «значение».
Как мне правильно реализовать настоящий валидатор (типа ValidatorFn
) для этого formArray
?
Пока мне удалось создать только функцию, которая проверяет каждое поле, сравнивает его с предыдущим и следующим, если значения не соответствуют правилам, я вручную установил ошибку с помощью setErrors()
Эта функция находится в подписке ValueChanges()
, поэтому, когда значение в этом formArray
изменяется, она проверяет его с помощью моей функции
Есть ли способ лучше?
Здесь stackblizt (подписка valueChanges
не работает должным образом, она обновится только при записи в следующем поле, вы увидите, что я имею в виду в stackblitz)
https://stackblitz.com/edit/angular-mat-formfield-flex-layout-x9nksb
Спасибо