1

我有两个定制validatorreactive form,我调用下面函数来创建在部件的构造形式为:多个定制检验角2

private createForm(): void { 
this.passwordUpdateForm = this.formBuilder.group({ 
    newpassword : [null, Validators.required], 
    passwordconfirm: [null, Validators.required] 
}, 
{ 
    validator: [PasswordValidation.PasswordMatch, PasswordValidation.PasswordRule] // validation method 

}); 

}

PasswordValidation是具有类两个功能如下

export class PasswordValidation { 

    public static PasswordMatch(control: AbstractControl) { 
     let password = control.get('newpassword'); // to get value in input tag 
     if(password){ 
      let confirmPassword = control.get('passwordconfirm').value; // to get value in input tag 
      if (password.value !== confirmPassword) { 
       control.get('passwordconfirm').setErrors({ ['passwordmatch'] : true}); 
      }else { 
       return null; 
      } 
     } 
    } 

    public static PasswordRule(control: AbstractControl) { 
     let password = control.get('newpassword').value; // to get value in input tag 
     let pattern = new RegExp('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#[email protected]$%^&*-]).{8,64}');    
     if (!pattern.test(password)) { 
      control.get('newpassword').setErrors({ ['passwordrule'] : true}); 
     }else if (password.toLowerCase() === 'something') { 
      control.get('newpassword').setErrors({ ['passwordrule'] : true}); 
     }else { 
      return null; 
     } 
    } 
} 

每个自定义验证工作正常分别是这样

validator: PasswordValidation.PasswordMatch 

或本

validator: PasswordValidation.PasswordRule 

但在阵列状

validator: [PasswordValidation.PasswordMatch, PasswordValidation.PasswordRule] 

得到错误this.validator is not a function使用他们与不工作,我没有任何想法,请帮帮我。

+0

你可以尝试用'Validators.compose()',它接受多个验证对一个领域。 – Niladri

+1

是使用compose():验证器:Validators.compose([[PasswordValidation.PasswordMatch,PasswordValidation.PasswordRule])} – Vega

+0

@Vega不起作用 – Parid0kht

回答

2

它更好地使用Validators.compose([])它接受验证器数组用于在窗体组中的特定用户控件。

例如,如果您要添加的验证对passwordconfirmnewpassword的控制,你可以像下面

private createForm(): void { 
this.passwordUpdateForm = this.formBuilder.group({ 
    newpassword : [null, Validators.compose([Validators.required,PasswordValidation.PasswordRule])], 
    passwordconfirm: [null, Validators.compose([Validators.required, PasswordValidation.PasswordMatch])] 
}); 

引擎盖这下是代码的样子

group(controlsConfig: {[key: string]: any}, extra: {[key: string]: any} = null): FormGroup { 
    const controls = this._reduceControls(controlsConfig); 
    const validator: ValidatorFn = isPresent(extra) ? extra['validator'] : null; 
    const asyncValidator: AsyncValidatorFn = isPresent(extra) ? extra['asyncValidator'] : null; 
    return new FormGroup(controls, validator, asyncValidator); 
} 

你可以看到参数validator实际上是一种类型的接口ValidatorFn,看起来像下面那样

interface ValidatorFn { 
    (c: AbstractControl): ValidationErrors|null 
} 

所以你可以看到它可以接受任何具有上述签名的方法。

来源:https://angular.io/api/forms/ValidatorFn

检查此链接更多:https://toddmotto.com/reactive-formgroup-validation-angular-2

+0

我测试了它,但没有成功,因为'validators.compose'接受返回'observable'或'promise'的验证码:/ – Parid0kht

+0

@ Parid0kht我想你是在谈论异步验证器,但是从你的代码仅使用静态同步验证程序。对于同步验证器Observable或Promise不是必需的。我已经更新了我的答案,并解释了为什么您无法将验证器作为数组传递给'formbuilder.group()'方法。 – Niladri