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

使用FormBuilder的角反应性表单自定义验证

邬安邦
2023-03-14

我有一个名为productionControlValidator的自定义验证器函数。

如果我像这样设置表单,一切都工作了:

this.validTest = new FormGroup({
    isdrawing: new FormControl(true),
    inventoryControl: new FormControl(null)
}, { validators: productionControlValidator });

但是,如果我使用这样的表单生成器设置表单:

this.validTest = this.fb.group({
    isdrawing: true,
    inventoryControl: null
}, { validators: productionControlValidator });

如果构造函数中将fb定义为private fb:FormBuilder,则验证不起作用。所谓“不工作”,我的意思是表单的valid属性不正确,在控制台中我看不到预期的输出(使用第一个方法显示)。

我没有在第二个方法中正确定义验证器(如果是这样的话,应该如何定义它),或者FormBuilder有什么东西使自定义验证器不可用?

共有3个答案

施彬郁
2023-03-14

在formGroup中的value更改时触发窗体验证。

下面是一个示例:反应式表单自定义验证器

一旦更改表单的值,我们就可以触发整个表单的表单验证。

下面是示例类:

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent implements OnInit  {

  validTest: FormGroup;
  hasError = false;

  constructor(private fb: FormBuilder) {
  }

  ngOnInit() {
    this.validTest = this.fb.group ({
      isdrawing: [true, [Validators.required]],
      inventoryControl: ['10', [Validators.required, Validators.pattern('[0-9]*')]]
    });

    this.validTest.valueChanges.subscribe(form => {
      if(form) {
        this.productionControlValidator(form);
      }
    });
  }

  private productionControlValidator(form) {
    // custom validations for form controls

    if(form) {
      this.hasError = this.validTest.invalid;
    }
  }
}

html模板示例:

<form [formGroup]="validTest">
  <input 
    type="checkbox"
    formControlName="isdrawing"/>

    <input
      type="text"
      formControlName="inventoryControl"
    />

    <div *ngIf="hasError">Form contains errors !!!</div>
</form>
轩辕炎彬
2023-03-14

对于自定义验证器文档,请尝试使用验证器而不是验证器:https://angular.io/api/forms/AbstractControl#root

(validator validator fn | null)确定此控件同步有效性的函数。

this.validTest = this.fb.group({
    isdrawing: true,
    inventoryControl: null
}, { validator: productionControlValidator });
谈渊
2023-03-14

更多信息---

在组件中使用自定义验证服务

import {CustomValidationService } from './custom.service'

this.validTest = this.fb.group({
    name: [null, [Validators.required, CustomValidationService.nameValidator],
    inventoryControl: [null, [CustomValidation]]
});

您可以创建自定义验证服务,如下所示:

@Injectable()
export class CustomValidationService {
    // Name validation 
        static nameValidator(control: FormControl) {
            if (control.value) {
                const matches = control.value.match(/^[A-Za-z\s]+$/);
                return matches ? null : { 'invalidName': true };
            } else {
                return null;
            }
        }
}
 类似资料:
  • 问题内容: 我正在使用带有自定义验证的Angular2的FormBuilder开发表单。问题:在customValidator中,我用来访问本地对象。执行验证时出现错误。 看起来customValidator是在其他对象中执行的,因此更改了引用 问题: 如何传递对customValidator 的引用? 问题答案: 使用箭头函数,以确保该函数绑定到此:

  • 现在我正在创建这个表单生成器: 当我收到我正在执行的元素的错误消息时: 显示:键控件:myaccount,键错误:必需,错误值:true 问题是我不想显示“myaccount”,而是要显示“myaccount”。我试图以某种方式做到这一点: 但这是不可能的。我该怎么做呢? 编辑: 我想显示标签(特定的),而不是表单上的值。我想为我的控制台自定义一个特定的名称。日志

  • 问题内容: 我有一个看起来像这样的表格: 它的设置使得输入数据后所有必填字段和“保存”按钮都可以使用。但是,部分验证是,我将使用输入的数据使用$ http通过POST通过服务器访问服务器。 我应该在函数中放置该逻辑还是有一个更好的放置位置? 更新: * 我实现了以下内容,将其作为元素上的属性应用,但它在每次我不喜欢的按键上调用服务器/数据库: 问题答案: 您不需要在指令中发出$ http请求,更好

  • 我有问题得到反应角色的工作与自定义表情符号。如果我使用不和谐表情符号,它会嵌入消息,创建反应,并在点击反应时应用角色。 然而,如果我使用一个自定义的emoji,它会嵌入消息并创建正确的反应,但是它不提供当emoji被点击时的角色。 我使用了相同的编码,当交换不和谐和自定义的表情符号,唯一的改变是表情符号的ID。 我使用的完整代码是: 我们将非常感谢对此提供任何帮助。

  • 让我们假设使用相同的登录表单,但现在我们还要测试我们的密码在其中某处有感叹号。 app/login-form.component.ts 一个简单的函数接受实例,并返回null如果一切都很好。 如果测试失败,它返回一个具有任意命名属性的对象。 属性名称将用于.hasError()测试。 app/login-form.component.ts <!-- ... --> <div [hidden]="!

  • 本文向大家介绍Angular2表单自定义验证器的实现,包括了Angular2表单自定义验证器的实现的使用技巧和注意事项,需要的朋友参考一下 本文主要给大家介绍如何判断验证器的结果。在这里,我们就来看看怎样实现一个自定义的验证器。 目标 我们要实现一个验证手机号的验证器,使用的实例还是基于之前的文章里面的实例,也就是用户信息输入的表单页面。我们在手机号的元素上添加一个验证手机号的验证器。然后,如果手