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

FormGroup不会使用验证器对验证器作出反应

笪烨
2023-03-14

我试图用一个自定义验证器将整个fromGroup设置为无效,这似乎不起作用。。。

下面代码的目标是比较FromGroup的两个实例。

  • 如果它们匹配,则表示未进行任何更改,因此必须无效。
  • 否则它不匹配,这意味着已经进行了更改,所以它必须是有效的

我的变量isValid在我记录时工作正常。它会根据变化变为真或假。

但是我无法使from无效,我已经尝试了很多方法,比如文章和堆栈溢出,这有一个stackblitz,但它似乎也不起作用。

this.updateCyclistForm.set错误({'无效': true});from Angular 6只需要多个字段中的一个字段Reactive Form

我看过很多类似的帖子,其中一篇使用控件,但这里不是这样。

public updateCyclistForm: FormGroup
public savedStateOfForm: FormGroup

...

constructor(...) {
    ...
    this.savedStateOfForm = new FormGroup({
        status: new FormControl(this.currentReg.status, []),
        role: new FormControl(this.currentReg.role, []),
        passes: new FormControl({ data: this.passesUID }, [])
    })
    this.updateCyclistForm = new FormGroup({
        status: new FormControl(this.currentReg.status, []),
        role: new FormControl(this.currentReg.role, []),
        passes: new FormControl({ data: this.passesUID }, [])
    })
    this.updateCyclistForm.setValidators(this.isValid(this.savedStateOfForm));
}
    
...

isValid = (clone: FormGroup): ValidatorFn => {
    return (group: FormGroup): ValidationErrors => {
        let isValid = JSON.stringify(clone.value) != JSON.stringify(control.value)
        group.setErrors({ 'valid': isValid });
        this.updateCyclistForm.setErrors({ 'valid': isValid });
        return
    }
}

HTML

<button type="submit" [disabled]="!updateCyclistForm.valid">Save</button>

按钮从未被禁用,为什么?我做错了什么?

编辑:

我还尝试使用类似于@Adam的答案。这使得我的按钮被终身禁用。

  isValid = (clone: FormGroup): ValidatorFn => {
        return (group: FormGroup) : ValidationErrors => {
            return {
                invalid: JSON.stringify(clone.value) != JSON.stringify(group.value) ? true : null
              }
        }
    }

共有2个答案

曾奇略
2023-03-14

感谢@Adam的帮助

这就是解决方案

isValid = (clone: FormGroup) => {
    return (group: FormGroup) => {
        return JSON.stringify(clone.value) != JSON.stringify(group.value) ? null : { invalid: JSON.stringify(clone.value) != JSON.stringify(group.value) }
    }
}
艾仲渊
2023-03-14

setValidators必须接受返回ValidationErrors(或null)的ValidatorFn函数

constructor() {

   // ...

   this.updateCyclistForm.setValidators(this.updateCyclistValidator);
}


...

updateCyclistValidator(ctrl: FormGroup) {
   const valid = // run your validation uisng the values in ctrl

   // if there are no errors, you MUST return null
   if(valid) return null;

   // return your errors, for example:
   return {
     role: 'choose a role'
   }
    
}

验证器返回的错误的存在与否告诉angular您的表单是否有效。

 类似资料:
  • 问题内容: 我的页面上有一个表单,当我调用它时,将forms类设置为,但仍然返回true。我在这里做错了什么? 模板 零件 问题答案: 它()行为正确。您的表单需要用户名和密码,因此,当您重置表单时,该表单应该无效(即,没有用户名/密码的表单无效)。 如果我理解正确,那么这里的问题就是为什么在您第一次加载页面(表单也是无效的)时并没有出现红色错误,而是在您单击按钮时弹出了红色错误。当您使用Mate

  • 首先,我是Vaadin7的新手。当我发现BeanFieldGroup.class时,我正在尝试一些vaadin演示。正如我所看到的,这个类将一个字段绑定到一个bean属性。在bean中,使用验证约束注释对属性进行注释(JSR303)。在本例中,我的pom.xml包含hibernate验证器依赖项: 我创建了validationmessage.properties文件,并在其中放了一些消息(带有匈牙

  • 现在,我正在用Spring MVC开发一个web应用程序。 样品值可以是“0.05”、“1.00”、“12.55”等。 因此,如果有任何办法来解决这个问题,请点亮我。谢了。

  • 正常情况都需要对用户输入参数进行校验,此时就会用到验证器。验证器可以验证控制器中参数,也支持验证 Websocket 参数以及 RPC 参数验证,提供默认和自定义两种类型的验证器,还可添加自定义验证规则。 安装 使用验证器前,需要安装验证器组件,安装如下: composer require swoft/validator 启用 成功安装好验证组件后,接下来需要启用验证器,这里以 Http-ser

  • 前言 hyperf/validation 衍生于 illuminate/validation,我们对它进行了一些改造,但保持了验证规则的相同。在这里感谢一下 Laravel 开发组,实现了如此强大好用的验证器组件。 安装 引入组件包 composer require hyperf/validation 添加中间件 您需要为使用到验证器组件的 Server 在 config/autoload/mi

  • imi 提供了基本数据类型的验证,以及可扩展的验证方法,这一切都可以通过注解来使用。 注解 @Condition 通用验证条件,传入回调进行验证 该注解可以写在类、属性、方法上。 参数: /** * 参数名称 * 属性注解可省略 * * @var string */ public $name; /** * 非必验证,只有当值存在才验证 * * @var boolean */ p