当前位置: 首页 > 知识库问答 >
问题:

获取存在于FormGroup/FormControl中的验证器

戚浩淼
2023-03-14

我在我的应用程序中使用材料2,但在这个问题中,我想专门解决输入的问题。

正如您在API参考中看到的,有一个名为“required”的属性绑定,它在占位符中显示为星号。

因此,我想知道是否有方法检查表单控件在Angular中是否有特定的验证器,因为我真的不想为每个输入手动设置

我阅读了AbstractControl文档,但没有找到任何有关它的内容。我遇到了hasError方法(具有讽刺意味的是,它在任何地方都没有记录...既不是在FormGroup中,也不是在FormControl中,也不是在AbstractControl中),但这不是我要找的。它只是检查表单控件是否有错误,但您可能已经阅读过,我想检查控件是否有一些特定的验证器...

一些代码:

<md-input-container>
  <input placeholder="Placeholder" 
         mdInput [formControl]="anyCtrl" 
         [required]="anyCtrl.hasValidator('required')"> <!-- something like this -->
</md-input-container>

我希望这个问题足够清楚。提前谢谢。

共有3个答案

暨高洁
2023-03-14

Angular v12.2引入了hasValidator():https://github.com/angular/angular/pull/42838

示例this.formGroup.controls['anyCtrl].hasValidator(Validators.required)

您还可以稍后以编程方式添加或删除验证器。请参阅addValidators()RemoveValidators()等。

https://angular.io/api/forms/AbstractControl#hasValidator

班浩皛
2023-03-14

这个答案是@joh04667的延续,他们写道:

public hasValidator(control: string, validator: string): boolean {
  return !!this.myForm.controls[control].validators(control).hasOwnProperty(validator);
 // returns true if control has the validator
}

然而,没有抽象控件。validators()方法。我假设是AbstractControls。validator()的意思是。

方法仅适用于“失败”的验证器(例如,值为“”(空)的控件上的必需验证器)。因为如果通过,则返回null。一种解决方法是设置值,使其始终失败,然后恢复。

public hasValidator(control: string, validator: string): boolean {
    let control: AbstractControl = this.myForm.controls[control];
    let lastValue: any = control.value;
    switch(validator) {
        case 'required':
            control.setValue('');  // as is appropriate for the control
        case 'pattern':
            control.setValue('3'); // given you have knowledge of what the pattern is - say its '\d\d\d'
        ....
    }
    let hasValidator: boolean = !!control.validator(control).hasOwnProperty(validator);

    control.setValue(lastValue);
    return hasValidator;
}

这太可怕了。它回避了一个问题——为什么没有抽象控制。getValidators():ValidatorFn[]| null?

隐藏这一点的动机是什么?也许他们担心有人会输入他们的代码:

...
secretPassword: ['', [Validators.pattern('fjdfjafj734738&UERUEIOJDFDJj')]
...
慕容坚
2023-03-14

Angular并不能真正提供一种很好、干净的方法来实现这一点,但这是可能的。我认为验证器存储在注入FormBuilder的服务中(NG\u验证器),我将研究劫持该服务或将其注入组件,但目前这将起作用:

文档和源代码在AbstractControl上显示了键入到ValidatorFn的validator成员<不幸的是,代码>验证器fn只是有一个null类型,所以我们看不到发生了什么。然而,在戳透生成的源代码并探测应用程序后,我们似乎可以传递这个验证器方法a控件参数,该参数将返回该控件上所有验证器的对象,无论它是否在传递。

奇怪的是,这只适用于FormControl本身,而不适用于FormGroup(在FormGroup上,验证器成员不是函数,并且在我的测试中始终是null)。编译后的JS表示此函数接受控制参数;我尝试过传入FormControl引用,但据我所知,只要此参数不为空,它只会返回控件上的验证器。

// in the constructor
this.myForm = this.formBuilder.group({
  'anyCtrl': ['', Validators.required],
  'anotherCtrl': ['', Validators.compose([Validators.required, Validators.email])]
});

// later on 
let theValidators = this.myForm.controls['anyCtrl'].validator('');
console.log(theValidators) // -> {required: true};

let otherValidators = this.myForm.controls['anotherCtrl'].validator('');
console.log(otherValidators); // -> {required: true, email: true}
public hasValidator(control: string, validator: string): boolean {
  return !!this.myForm.controls[control].validator(control).hasOwnProperty(validator);
 // returns true if control has the validator
}

在您的标记中:

<md-input-container>
  <input placeholder="Placeholder" 
         mdInput [formControl]="anyCtrl" 
         [required]="hasValidator('anyCtrl', 'email')">
</md-input-container>

必需的验证器有一个快捷方式。绑定实际上是指令(source/forms.js的第5022行)的一个实例。该指令实际上将把所需的验证器添加到它打开的窗体控件中。这相当于添加验证器。初始化时需要表单组。因此,将绑定属性设置为false将从该控件中删除所需的验证器,反之亦然……无论哪种方式,该指令都会影响窗体控件。必需的值,因此将其绑定到一个需要更改的属性实际上不会起多大作用。

唯一的区别是,[必需]指令在验证程序时向占位符添加星号。必需的没有。

我将继续研究NG_验证器,但我希望现在能有所帮助!

 类似资料:
  • 问题内容: 我有一个在Windows 2012 R2 x64上运行的Jenkins(2.0 Beta-2)服务器,并配置了新版本以从TFS GIT(2013)获取源文件。我已经安装了Microsoft提供的Windows版Git,该版本声称可以解决GIT CLI和TFS GIT之间的身份验证问题。 我的.gitconfig看起来像这样: Jenkins在服务帐户下运行,没有交互式会话。该服务帐户是

  • 我询问了如何建立一个服务呼叫,并在HttpClient上获得了一个很好的信息。然而,虽然这个问题在技术上得到了回答,但我还是被卡住了。 在控制台中,我可以看到我的浏览器向服务发送了什么请求来获取授权令牌。然而,当我尝试在我的服务层中模拟构建请求的调用时,我得到以下错误消息。我在这里犯错的可能性很大。不知道该用谷歌搜索什么,真的。。。 "StatusCode: 500, ReasonPhrase:'

  • 我试图用一个自定义验证器将整个设置为无效,这似乎不起作用。。。 下面代码的目标是比较FromGroup的两个实例。 如果它们匹配,则表示未进行任何更改,因此必须无效。 否则它不匹配,这意味着已经进行了更改,所以它必须是有效的 我的变量在我记录时工作正常。它会根据变化变为真或假。 但是我无法使from无效,我已经尝试了很多方法,比如文章和堆栈溢出,这有一个stackblitz,但它似乎也不起作用。

  • 是否可以使用自定义验证器将表单字段的输入与列表进行比较?我并不是试图比较两个表单控件。 我一直在尝试这种方法: 其中,在方法中,我将比较类别表单控件的值与可接受类别的列表。 然而,我在语法中迷失了方向,并在尝试用这种方法时出现了一些错误。有人有更好的方法将表单控件值与列表进行比较吗???

  • 接口说明 获取验证码 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 POST /api/server/1.0.0/getValidCode 是否需要登录 否 请求字段说明 无 响应字段说明 无 响应成功示例 {} 响应失败示例 {} 响应接受类型 image/jpeg;charset=UTF-8 响应状态码 HTTP状态码 原因 204 N