如何在初始化后将Formalators设置为FormGroup

时间:2017-12-18 11:28:35

标签: angular validation angular5

我有这个FormGroup

defaultIdNumberValidator = [Validators.required, Validators.minLength(6),
    Validators.maxLength(11)];

this.registerForm = this.formBuilder.group({ 
  permissions: this.formBuilder.group({
    country: ['', [Validators.required]],
    identityNumber: [null, this.defaultIdNumberValidator],
  }, {validator: [this.validateId]}) 
});

我希望根据identityNumber方法中的某些条件清除并向this.validateId添加验证器。

validateId(input: AbstractControl) {
  if(condition) {
    input.get("identityNumber").clearValidators(); //this is working
  }
  if(condition) {
    input.get("identityNumber").setValidators(this.defaultIdNumberValidator); //not working
  }
}

当调用setValidators方法时,我收到此错误(第109行是调用setValidators的行)

ERROR TypeError: Cannot read property 'defaultIdNumberValidator' of undefined
    at RegisterComponent.validateId (register.component.ts:109)
    at eval (forms.js:742)
    at Array.map (<anonymous>)
    at _executeValidators (forms.js:742)
    at eval (forms.js:694)
    at eval (forms.js:742)
    at Array.map (<anonymous>)
    at _executeValidators (forms.js:742)
    at eval (forms.js:694)
    at eval (forms.js:742)

更新:

我重新启动开发服务器,现在我收到此错误

ERROR TypeError: Cannot read property 'setValidators' of undefined
at RegisterComponent.validateId (register.component.ts:109)
at eval (forms.js:742)
at Array.map (<anonymous>)
at _executeValidators (forms.js:742)
at eval (forms.js:694)
at eval (forms.js:742)
at Array.map (<anonymous>)
at _executeValidators (forms.js:742)
at eval (forms.js:694)

更新2:

我创建简单的plunker来重现错误。如果您首先单击输入而不是单击其他位置,则会在其下面出现错误。因此,当输入值的长度> = 2时应该删除此错误,并且当> = 5时应该再次可见。我也不知道为什么当输入值的长度为3而不是2时错误消失。

1 个答案:

答案 0 :(得分:5)

您需要Public Sub TestMe() Dim myCellH As Range Dim myCellV As Range Dim DataRange As Range Dim o As Long Set DataRange = Range("A1:A10") For Each myCellH In DataRange.Cells If InStr(myCellH, "animals") <> 0 Then Set myCellV = myCellH Do Until myCellV.Font.ColorIndex = 50 myCellV.Value = myCellV.Value & o o = o + 1 Set myCellV = myCellV.Offset(0, 1) Loop End If Next End Sub 来保留bind(this)的上下文。您还需要使用this来更新要更新的验证程序。在那里我们还需要不发出一个事件,如果你是这样,这种情况会循环,直到你的浏览器崩溃。所以改变以下内容:

updateValueAndValidity

并且验证器看起来像这样:

}, {validator: this.validateId.bind(this)}) 

PLUNKER