返回Promise或Observable的预期验证器

时间:2018-05-27 00:27:00

标签: javascript angular angular5 angular-forms angular-validation

我试图在Angular 5上进行自定义验证,但我面临以下错误

Expected validator to return Promise or Observable

如果值与所需的值不匹配,我只想将错误返回到表单,继承我的代码:

这是我的表单

的组件
  constructor(fb: FormBuilder, private cadastroService:CadastroService) {
    this.signUp = fb.group({
      "name": ["", Validators.compose([Validators.required, Validators.minLength(2)])],
      "email": ["", Validators.compose([Validators.required, Validators.email])],
      "phone": ["", Validators.compose([Validators.required, Validators.minLength(5)])],
      "cpf": ["", Validators.required, ValidateCpf]
    })     
   }

此代码位于包含我要实现的验证的文件中:

import { AbstractControl } from '@angular/forms';

export function ValidateCpf(control: AbstractControl){
    if (control.value == 13445) {
        return {errorCpf: true}
    }
    return null;
}

有人能帮助我吗?这种类型的验证只适用于observables,还是我能做到而不是一个承诺或可观察的?感谢

9 个答案:

答案 0 :(得分:25)

以下内容应该有效:

  "cpf": ["", [Validators.required, ValidateCpf]]

表单控件期望的参数如下:

constructor(formState: any = null, 
            validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null,
            asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null)

来自https://angular.io/api/forms/FormControl

答案 1 :(得分:20)

这意味着您必须在数组中添加多个验证器

。 示例:

有错误

profileFormGroup = {
  budget: [null, Validators.required, Validators.min(1)]
};

以上所述引发错误,验证程序返回Promise或Observable

修复:

profileFormGroup = {
  budget: [null, [Validators.required, Validators.min(1)]]
};

说明:

当使用多个验证器时,通过使用内置验证器(可以在第二位置的数组中给出)进行角反应形式验证。

  

FIELD_KEY:[INITIAL_VALUE,[LIST_OF_VALIDATORS]]

答案 2 :(得分:1)

Validators.compose()是多余的;

您可以只传递一个数组。 OP的问题是由于未能将验证器包装在[]中以使其成为数组而引起的,因此,假定minLength()是异步的,并因此而产生错误消息。

我希望,该解决方案能够为您提供帮助。谢谢。

答案 3 :(得分:1)

错误:  userName:['',[Validators.required,Validators.minLength(3)],forbiddenNameValidator(/ password /)],

ans:  userName:['',[Validators.required,Validators.minLength(3),forbiddenNameValidator(/ password /)]],

验证器仅在内部数组中使用第二个参数。不适合外部阵列

答案 4 :(得分:0)

如果添加多个验证器,则需要添加另一个第三个括号“ []”,并在其中添加验证器。如下所示:

this.yourForm= this.formBuilder.group({
    amount: [null, [Validators.required, Validators.min(1)]],
});

答案 5 :(得分:0)

与OP的问题没有直接关系,但是在稍有不同的问题上却遇到了相同的错误。我有一个异步验证器,但是我忘了从中返回一个Observable(或Promise)。

这是我最初的异步验证器

public availableEmail(formControl: FormControl) {
   if(formControl && formControl.value){
     return this.http.get('')
   }
}

问题是,如果if语句为假,该怎么办?我们不返回任何内容,并且出现运行时错误。我添加了返回类型(确保如果我们不返回正确的类型,IDE会发出抱怨),然后在if语句失败的情况下返回of(true)

这是更新的异步验证器。

public availableEmail(formControl: FormControl): Observable<any> {
   if(formControl && formControl.value){
     return this.http.get('someUrl');
   }
   return of(true);
}

答案 6 :(得分:0)

错误:  "cpf": ["", Validators.required, ValidateCpf]

修复:  "cpf": ["", [Validators.required, ValidateCpf]]

答案 7 :(得分:0)

除了可以接受的答案以外,我认为还可以澄清错误的发生,因为使用反应形式创建FormControl时,在initial_value之后,以下参数分别是按以下形式分组的同步验证器和异步验证器:每个数组。例如:

myFormGroup = this.fb.group({
    myControl: ['', [ mySyncValidators ], [ myAsyncValidators ] ]
})

如果控件碰巧只有一个,则Angular会将其作为单个元素接受。例如:

myFormGroup = this.fb.group({
    myControl: ['', mySyncValidator, myAsyncValidator ]
})

因此,当忘记将它们分组的方括号时,Angular假定第二个验证器项是异步验证器的一部分,因此我们得到了Expected validator to return Promise or Observable

答案 8 :(得分:0)

如果你做这样的事情通常会发生这种类型的错误 -

<script src="https://www.google.com/recaptcha/api.js?render=<cfoutput>#application.SiteKey#</cfoutput>"></script>


<cfif ISDEFINED('FORM.FirstName')> <!--- check if form was submitted and if so run code below --->

    <cfhttp url="https://www.google.com/recaptcha/api/siteverify?secret=#application.SecretKey#&response=#FORM['g-recaptcha-response']#" result="Response" />
    <cfset Return = deserializeJSON(Response.FileContent) />

    <cfif Return.success IS 'true' AND Return.score GT 0.0> <!--- check if true and if score is greater than 0.5. Run code below if all good. --->

        <cfoutput>Human: #FORM.FirstName# #FORM.LastName#</cfoutput>
        <!--- you can do database entry and/or email results here --->

    <cfelse>  <!--- if not a human, do this. I usually remove the else part completely, but if you need to do something with the robot, do it here.  --->

        Most likely a robot.

    </cfif>

<cfelse> <!--- show form --->

    <form method="post" action="/contact.cfm">  <!--- submit form back to itself --->
      First Name: <input name="FirstName" type="text"><br>
      Last Name: <input name="LastName" type="text"><br>
      <input name="submit" type="submit">
      <input name="g-recaptcha-response" id="g-recaptcha-response" type="hidden" /> <!--- javascript below gives this a value from google. --->
    </form>

    <script>
    grecaptcha.ready(function() {
        grecaptcha.execute('<cfoutput>#application.SiteKey#</cfoutput>', {action: 'homepage'})
            .then(function(token) {
                document.getElementById('g-recaptcha-response').value=token;
            });
        });
    </script>

</cfif>

将其更改为 -

name: ['',Validators.required, Validators.compose([Validators.minLength(3),Validators.maxLength(15)])]

第二个字段 -> 验证器