【发布时间】:2018-12-05 10:50:16
【问题描述】:
我有一个 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 处的对象属性必须具有比下一个索引更大的值。
所以在myForm,
pairs[0].score > pairs[1].score
pairs[1].score > pairs[2].score
pairs[2].score > pairs[3].score
属性“值”也是如此。
我怎样才能为这个formArray 正确实现一个真正的验证器(类型ValidatorFn)?
到目前为止,我只设法创建了一个函数,它检查每个字段,将其与上一个和下一个进行比较,如果值不符合规则,我手动设置错误 setErrors()
这个函数在ValueChanges()订阅中,所以当formArray中的一个值改变时,它会用我的函数检查它
有没有更好的办法?
这里是一个stackblizt(valueChanges订阅不能正常工作,它只会在下一个字段写入时刷新,你会在stackblitz中看到我的意思)
https://stackblitz.com/edit/angular-mat-formfield-flex-layout-x9nksb
谢谢
【问题讨论】:
-
您应该提供一个 minimal example :一个仅重现您的问题的示例。无论如何,我正在制作一个,我会及时通知你
-
我没有这样做吗?在 stackblitz 中,我放置了我当前的解决方案,并且我正在寻找一种方法来使用为 FormGroups 提供的验证器函数!感谢您的帮助
-
你做到了,但它不是最小的,有很多无用的函数和 HTML(这真的很好,它只是让人们专注于其他事情)。您已经是提供minimal reproducible examples 的 1% 的一部分,所以我不会在表格上抱怨,我只是为您下次提供建议:)
-
okk 知道了,下次会做的更好!谢谢你的帮助
标签: javascript angular forms formarray