这是一个小问题,但它困扰着我。
我有一个场景,我从窗体外面得到一个值(让我们说一个布尔值),这意味着它不是formgroup的一部分。基于该值,我想设置一个自定义验证器,因为它不适用于可用的验证器(required
,pattern
...)这是一个非常简化代码展示:
因此,问题很容易设置所需的验证器:
if(bool) {
this.myForm.get('field').setValidators([Validators.required])
this.myForm.get('field').updateValueAndValidity();
} else ....
我想要一种设置自定义验证错误的方法。如下所示:
this.myForm.get('field').setValidators([{notValid: true}])
但是上面的工作没有用,但我需要这样做:
this.myForm.get('field').setValidators([this.customValidator])
customValidator(field) {
return {notValid: true}
}
是否无法在一行上设置自定义验证,而不是需要customValidator
? (或任何其他更好的方式)
我知道,小问题,但它一直困扰着我,代码实际上也比这里复杂。
PS。我知道我可以这样做并使用一个可用的验证器将其标记为无效,但如果可能的话我想要干净的解决方案。
答案 0 :(得分:0)
首先,lambda可以将其转换为单线,但要注意的是,其返回值不能以{
开头,否则它将被视为函数体,因此请在类型转换之前添加像<any>
this.myForm.get('field').setValidators(f => <any>{notValid:true})
第二,如果自定义验证以表单外部的状态为条件,则可以考虑将布尔检查移到验证器本身。
.setValidators(f => outsideBoolean ? {notValid:true} : null)
但是,在externalBoolean更改时,您仍然必须自己运行updateValueAndValidity()
。甚至作为跨域验证器,表单也不会自动更新。
或者,对于该布尔值根本不使用角度/形式。
第3种方法:使用<input type="hidden"
并在其中放入outsideBoolean,因此它确实参与了表单验证机制。