角度模型驱动的表单:在' setValidators()'中设置自定义验证器

时间:2017-06-13 16:32:55

标签: angular angular2-forms

这是一个小问题,但它困扰着我。

我有一个场景,我从窗体外面得到一个值(让我们说一个布尔值),这意味着它不是formgroup的一部分。基于该值,我想设置一个自定义验证器,因为它不适用于可用的验证器(requiredpattern ...)这是一个非常简化代码展示: 因此,问题很容易设置所需的验证器:

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。我知道我可以这样做并使用一个可用的验证器将其标记为无效,但如果可能的话我想要干净的解决方案。

1 个答案:

答案 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,因此它确实参与了表单验证机制。