首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Angular FormGroup验证器不在FormControl上保留setError

在Angular中,FormGroupFormControl 是表单验证的核心组件。FormControl 代表表单中的一个单独字段,而 FormGroup 则是一组 FormControl 的集合。验证器通常应用于这些控件上,以确保用户输入的数据符合预期的格式或条件。

基础概念

  • FormControl: 表单中的一个字段,可以单独进行验证。
  • FormGroup: 包含多个 FormControl 的容器,可以对其所有子控件应用验证器。
  • Validator: 一个函数,用于检查 FormControlFormGroup 的值是否有效,并返回错误对象或 null

问题描述

当你在 FormGroup 上设置验证器时,有时可能会发现这些验证器没有正确地反映在单个 FormControl 上。这通常是因为验证器的应用方式不正确,或者是因为验证器的逻辑没有正确地处理 FormGroup 中的每个 FormControl

原因分析

  1. 验证器应用位置错误: 如果你在 FormGroup 上设置了验证器,但没有正确地将其应用到每个 FormControl 上,那么这些验证器可能不会按预期工作。
  2. 自定义验证器逻辑问题: 如果你使用的是自定义验证器,可能是因为验证器的逻辑没有正确地处理 FormGroup 中的每个 FormControl

解决方案

正确应用验证器

确保你在 FormGroup 上设置的验证器能够正确地影响到每个 FormControl。你可以使用 FormGroupsetValidators 方法来设置验证器,并确保这些验证器能够访问到每个 FormControl

代码语言:txt
复制
import { FormGroup, FormControl, Validators } from '@angular/forms';

const formGroup = new FormGroup({
  name: new FormControl('', Validators.required),
  email: new FormControl('', [Validators.required, Validators.email])
});

// 设置一个自定义验证器,确保所有控件都不为空
formGroup.setValidators((group: FormGroup) => {
  const hasEmptyControl = Object.values(group.controls).some(control => control.errors?.required);
  return hasEmptyControl ? { 'allFieldsRequired': true } : null;
});

自定义验证器示例

如果你需要一个自定义验证器来检查所有字段是否都已填写,你可以这样写:

代码语言:txt
复制
function allFieldsRequiredValidator(formGroup: FormGroup) {
  const hasEmptyControl = Object.values(formGroup.controls).some(control => control.errors?.required);
  return hasEmptyControl ? { 'allFieldsRequired': true } : null;
}

const formGroup = new FormGroup({
  name: new FormControl('', Validators.required),
  email: new FormControl('', [Validators.required, Validators.email])
}, { validators: allFieldsRequiredValidator });

应用场景

这种验证模式适用于需要确保表单中所有字段都已填写的场景,例如注册表单、登录表单等。

优势

  • 集中管理验证逻辑: 在 FormGroup 级别设置验证器可以让你集中管理整个表单的验证逻辑。
  • 提高代码复用性: 自定义验证器可以在多个表单之间复用。

通过上述方法,你可以确保 FormGroup 上的验证器能够正确地反映在每个 FormControl 上,从而提供更好的用户体验和更健壮的表单验证。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Angular 从入坑到挖坑 - 表单控件概览

4.2.3、数据的有效性验证 某些时候需要对于用户输入的信息做有效性验证,此时可以在控件上添加上原生的 HTML 表单验证器来设定验证条件,当表单控件的数据发生变化时,angular 会通过指令的方式对数据进行验证...'@angular/core'; // 引入 FormControl 和 FormGroup 对象 import { FormControl, FormGroup } from '@angular/...from '@angular/forms'; // 引入 Validators 验证器 import { Validators } from '@angular/forms'; /** * 自定义验证方法...在模板驱动表单中,因为不是直接使用的 FormControl 实例,因此这里应该在模板上添加一个自定义的指令来完成对于控件数据的校验 使用 angular cli 创建一个用来进行表单验证的指令 ng...g directive direactives/hero-validate 在创建完成指令之后,我们需要将这个指令将该验证器添加到已经存在的验证器集合中,同时为了使这个指令可以与 angular 表单集成在一起

18.9K20
  • Angular系列教程-第四节

    1.表单 Angular 提供了两种不同的方法来通过表单处理用户输入:响应式表单和模板驱动表单。...两者都从视图中捕获用户输入事件、验证用户输入、创建表单模型、修改数据模型,并提供跟踪这些更改的途径 使用’@angular/forms’库中的FormGroup, FormControl,FormArray...和更新) formgroup使用 表单提交 更新部分内容(patchValue) 表单验证(导入Validators,设置字段属性) 表单状态(status) formarray(管理任意数量控件...) 表单验证 同步验证器和异步验证器 备注:同步验证先执行,异步验证后执行 3.模板驱动表单使用 导入formcontrol 使用ngModel实现双向绑定 使用模板变量来获取表单 4....内置验证器 min 此验证器要求控件的值大于或等于指定的数字 max 此验证器要求控件的值小于等于指定的数字 required 此验证器要求控件具有非空值 requiredTrue 此验证器要求控件的值为真

    2.8K50

    Angular 2 + 折腾记 :(7) 初步了解表单:模板驱动及数据驱动及脱坑要点

    : 用来追踪表单控件有效状态及值 =》 可以理解为获取且可以操作整个表单的数据 FormBuilder:表单数据构建工具[构建初始表单],简化构建代码(包括了new FormGroup(),new FormControl...(),new FormArray()),FormGroup()内置多种校验方式 formControlName: 同步与FormGroup构建表单内相同字段的值!.../core'; import { FormGroup, Validators, FormBuilder } from '@angular/forms'; // 引入表单的一些特性 import { Router...UserName': ['', Validators.compose([Validators.minLength(6)] // Validators可选参数 // 1. required :必须验证的.../core'; import { Router, ActivatedRoute } from '@angular/router'; import { FormGroup, FormControl, Validators

    3.8K20

    Angular17 使用 ngx-formly 动态表单

    ngx-formly 是 Angular 应用实现响应式的动态表单框架,不仅支持自动生成表单、易于上手的自定义字段扩展、自定义验证扩展、支持 Formly Schema 和 JSON Schema,还有开箱即用的内置表单主题...快速开始 创建 Angular 项目: 安装并执行 CLI 创建 Angular 项目 # 基于 Angular 17 版本演示 # 注意要将 Nodejs 版本切换至 18.13+ npm install...FormlyNgZorroAntdModule, ], ... }) export class WelcomeModule {} 第二步:在页面中添加 form 和 formly-form 组件: formGroup...添加 form 和 formly-form 组件必要的属性和函数,表单动态渲染主要依赖 fields 的定义: export class WelcomeComponent { form = new FormGroup...; 使用 Formly 内置验证: 在新用户注册表单的基础上增加输入年龄字段的配置,再为每个字段配置的 props 增加 required 属性,表示这是一个必填的字段,就像新用户注册表单中用户名字段一样

    71410

    (转) 别再对 Angular 表单的 ControlValueAccessor 感到迷惑

    FormControl 和 ControlValueAccessor 如果你之前使用过 Angular 表单,你可能会熟悉 FormControl ,Angular 官方文档将它描述为追踪单个表单控件值和有效性的实体对象...组件封装器 由于 Angular 为所有默认原生控件提供了控件值访问器,所以在封装第三方插件或组件时,需要写一个新的控件值访问器。...简单的封装器 最基础实现是通过简单封装使其能在屏幕上显示出来,所以我们需要一个 NgxJquerySliderComponent 组件,并在其模板里渲染出 slider: @Component({...要么选择DefaultValueAccessor 或者内置的数据访问器,否则 Angular 将会选择自定义的数据访问器,并且有且只有一个自定义的数据访问器(译者注:这句话参考 selectValueAccessor...你可能注意到 formControl 指令实际上简化了与父组件交互的方式。

    3.8K20

    Angular6自定义表单控件方式集成Editormd

    曾经找到过“Editor.md”,看之心喜,一直想在Angular中集成下这款markdownpad编辑器玩,在网上也只找到一篇通过指令集成的,虽然可以实现,但还是希望能做成组件形式的,之后看到一篇自定义组件的文章...ControlValueAccessor 这是自定义表单组件的核心,只有继承这个接口,才有被 Angular的formControl识别的资格。...表单控件能够保持一致的原理,可以看下formControl指令的实现: // https://github.com/angular/angular/blob/master/packages/forms/...注册自定义验证器 其中useExisting用来设置验证函数,可自定义: const UEDITOR_VALUE_ACCESSOR = { provide: NG_VALUE_ACCESSOR,...4.x 自定义表单控件 【荐】深入Angular自定义表单控件 Angular集成Editor.md的Markdown编辑器,支持NgModel双向绑定

    5.2K20

    Reactjs+BootStrap开发自制编程语言Monkey的编译器:创建简易的页面IDE

    接着我们执行: cd monkey_compiler npm start 上述命令执行后,命令会启动一个开发模式的服务器,同时会自动调用浏览器打开一个页面,页面指向本地地址http://localhost...> FormControl componentClass = "textarea" style={textAreaStyle...这些代码遵循的标准叫ES6,是最新版的js代码语法格式,实际上当前主流浏览器并不支持这种格式代码的解析和执行,但为何他们仍然能运行在各大浏览器中呢?...这里的JSX是一个比较抽象的概念,React的初学者很容易被这个概念搞得糊里糊涂,就像C语言的初学者总会被‘指针’搞得二和尚摸不在头脑一样。...一个组件实际上是一个逻辑上有高度耦合性的独立性个体。如果按照原有方式,那意味着需要把一个原则上不可分的个体分成了三部分(HTML,CSS,Javascript)。

    4.6K20

    Angular快速学习笔记(4) -- Observable与RxJS

    HTTP 模块使用可观察对象来处理 AJAX 请求和响应 路由器和表单模块使用可观察对象来监听对用户输入事件的响应 事件发送器 EventEmitter Angular 提供了一个 EventEmitter...可观察对象不会修改服务器的响应(和在承诺上串联起来的 .then() 调用一样)。...; } } 响应式表单 (reactive forms) FormControl 的 valueChanges 属性和 statusChanges 属性包含了会发出变更事件的可观察对象 import...{ FormGroup } from '@angular/forms'; @Component({ selector: 'my-component', template: 'MyComponent...本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

    5.2K20

    Angular: 最佳实践

    官网解释了如何使用 TS 编译器组合类型以轻松工作。这在处理来自 RESTful API 数据的时非常有用。...如果我们有一个 Order 类型的变量,我们只能将这三个字符串中的一个分配给 status 字段,分配其他的类型 TS 编辑器都会跑出错误。...在应用程序的 tsconfig.json 文件中,我们可以设置这个标志,告诉编辑器在未明确类型时候抛出错误。否则,编辑器坚定它无法推断变量的类型,而认为是 any 类型。...Rx.js 允许你去缓存 HTTP 请求的结果(实际上,任何的 Observable 都可以,但是我们现在说的是 HTTP 这内容),并且有一些示例你可能想要使用它。...& (this.submitted || this.form.controls[fieldName].touched); } } 复制代码 现在,我们有了个不错的模版,甚至可以轻松地测试我们的验证是否与单元测试一起正常工作

    2.9K40

    理论 | Angular 中的响应式编程 -- 浅淡 Rx 的流式思维

    Angular 中处理响应式表单只有 3 个步骤: 1、在组件的 HTML 模版中给要处理的控件加上 formControlName="blablabla" 2、form 标签中添加 [formGroup...]="xxx" 指令,这个 xxx 就是你在组件中声明的 FormGroup 类型的成员变量:比如下面代码中的 form: FormGroup; 3、在组件的构造函数中取得 FormBuilder 后(...这就需要一个滤波器的处理 .debounceTime(500),我们不去处理 500 毫秒内的变化,而是等待其输入停顿时再发送数据。...所幸的是,Angular 提供了对于响应式编程非常友好的设计,我们完全可以不在代码中做订阅或取消订阅的动作。那么问题来了,不订阅的话,值怎么获得呢?答案是 Async 管道。...Angular 4 中的 NgIf 的改进 Angular 4 中的 ngIf 现在可以携带 else 了,如果你曾经使用过 Angular 就知道,原来我们是得写两个 ngIf 来完成类似的功能的。

    5.3K10

    移除 View Engine 转用 Ivy,盘点Angular 12的重要更新

    事实上,从 Angular 9 开始,新的 Angular 应用程序就默认启用 lvy。...Webpack 5 模块捆绑器现已实现生产就绪。 不再支持 IE11 浏览器。 对于编译器,新版本提供转换组件样式资源的支持能力。 对于语言服务,新版本仅在模板中提供 Angular 属性补全功能。...向 FormArray 与 FormGroup 中引入 emitevent 选项。也是一项重大变化。 向 routerLinkActiveOptions 中引入更多微调控件。...在 HttpParams 上实现了 appendAll()方法。 在表单中,引入最小与最大值验证器。 新版本可导出 HTTP 状态码列表。...新版本还对大量 bug 做出修复,进一步完善了编译器、compiler-cli、Bazel 构建工具、路由器以及 Angular 内其他组件的运行质量。

    4.5K10

    Angular 18 引入了 Zoneless 变更检测

    译者 | 刘雅梦 策划 | Tina Angular 最近发布了 Angular 18,引入了 zoneless(无 zone.js)变更检测、新的开发者中心、多个特性的稳定版本以及服务器端渲染的改进等...provideExperimentalZonelessChangeDetection() ] }); 谷歌高级软件工程师 Alex Rickabaugh 在 X(前身名为 Twitter)上发表的推文谈到了在...Angular.dev 是 Angular 文档的官方网站。其中包含了动手入门之旅、互动游乐场、更新的指南和简化的导航。所有对 angular.io 的请求现在都重定向到了 angular.dev。...Angular 18 通过 i18n hydration 支持、更好的调试和由谷歌事件调度库提供的事件回放增强了服务器端渲染(SSR)。这些改进旨在确保服务器端渲染体验更加健壮并且更具交互性。...例如: const nameControl = new FormControl('name', Validators.required); nameControl.events.subscribe(event

    26410

    Angular v18 现已推出!

    作为收敛努力的结果,Wiz 将 Angular Signals 深度集成到他们的渲染模型中。在 ng-conf 上,我们分享了 YouTube 现在如何使用 Angular Signals。...我们的部分补水计划我们在 ng-conf 和 Google I/O 上宣布了部分水合作用。这是一种技术,允许您在服务器端呈现后逐步为应用补水。...而不是像今天这样在服务器上渲染@placeholder块,您将能够启用一种模式,让 Angular 在服务器上渲染@defer块的主要内容。...例如,下面是一个假设的 API:@defer (render on server; on viewport) { }上面的块将在服务器上呈现日历组件。...由于 webpack 不在新构建系统的关键路径上,我们将对 webpack 的依赖设置为可选,这使我们能够将 Angular CLI 的依赖项总数减少 50% 以上!

    28110
    领券