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

验证器和错误在Angular 9中不起作用

在Angular 9中,验证器和错误处理通常是通过表单控件来实现的。如果你发现验证器和错误没有按预期工作,可能是以下几个原因:

基础概念

  • 表单控件:Angular表单中的基本元素,可以是输入框、选择框等。
  • 验证器:用于检查表单控件的值是否有效的函数或对象。
  • 错误:当表单控件的值无效时显示的信息。

可能的原因及解决方法

1. 验证器未正确设置

确保你已经在表单控件上正确设置了验证器。

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

const myControl = new FormControl('', [Validators.required]);

2. 表单组或表单数组未正确使用

如果你在使用表单组(FormGroup)或表单数组(FormArray),确保它们已经正确配置。

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

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

3. 模板绑定问题

确保在模板中正确绑定了表单控件和错误信息。

代码语言:txt
复制
<form [formGroup]="myForm">
  <input formControlName="name">
  <div *ngIf="myForm.get('name').invalid && (myForm.get('name').dirty || myForm.get('name').touched)">
    <div *ngIf="myForm.get('name').errors?.required">Name is required.</div>
  </div>
</form>

4. 异步验证器问题

如果你使用了异步验证器,确保它们已经正确处理。

代码语言:txt
复制
import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';
import { Observable, of } from 'rxjs';
import { map } from 'rxjs/operators';

function asyncValidator(): ValidatorFn {
  return (control: AbstractControl): Observable<ValidationErrors | null> => {
    return of(control.value === 'async').pipe(
      map(isValid => isValid ? null : { asyncInvalid: true })
    );
  };
}

const myControl = new FormControl('', [], [asyncValidator()]);

5. 检查Angular版本兼容性

确保你使用的Angular版本和相关库的版本是兼容的。

应用场景

验证器和错误处理在需要用户输入的表单中非常常见,例如注册表单、登录表单、搜索表单等。

示例代码

以下是一个完整的示例,展示了如何在Angular 9中使用验证器和错误处理。

代码语言:txt
复制
// app.component.ts
import { Component } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  myForm = new FormGroup({
    name: new FormControl('', Validators.required),
    email: new FormControl('', [Validators.required, Validators.email])
  });
}
代码语言:txt
复制
<!-- app.component.html -->
<form [formGroup]="myForm">
  <input formControlName="name">
  <div *ngIf="myForm.get('name').invalid && (myForm.get('name').dirty || myForm.get('name').touched)">
    <div *ngIf="myForm.get('name').errors?.required">Name is required.</div>
  </div>

  <input formControlName="email">
  <div *ngIf="myForm.get('email').invalid && (myForm.get('email').dirty || myForm.get('email').touched)">
    <div *ngIf="myForm.get('email').errors?.required">Email is required.</div>
    <div *ngIf="myForm.get('email').errors?.email">Invalid email format.</div>
  </div>
</form>

参考链接

通过以上步骤,你应该能够解决Angular 9中验证器和错误不起作用的问题。如果问题仍然存在,请检查控制台是否有任何错误信息,并根据错误信息进一步调试。

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

相关·内容

Angular中sweetalert弹框的使用详解

所以我就想办法将sweetalert用到项目中,在项目中引入sweetalert时,遇到诸多问题,但最终在我不懈坚持下,都解决了,实现了效果。具体用法请看下文。...4、错误信息提示 1 swal("删除", "删除成功", 'error'); 效果: ?...五、相关问题 1、传函数错误 Swal(“确定提交吗”,  function(){}, ‘error’ );  //这种写法在我用的这个版本中是错误的,我的这个版本支持then(), 不支持直接在参数中写方法...2、API问题 在这个版本中以下写法只能实现title和text的效果,其他属性都不起作用 1 swal({ 2 title: "确定删除吗?"..., "success"); 12 }); 在这个版本中只能按照我最上面所列举的去实现,那是我在官方英文文档中发现的,中文文档太坑了。

2.8K40
  • 使用Angular CLI生成 Angular 5项目

    今天主要通过以下几个方面介绍Angular CLI: 生成项目 参数介绍 配置和自定义CLI 检查和修复代码 生成新项目: ng new my-app 这个命令会生成一个新的项目叫做my-app并把该项目的文件放在...但是对已经生成的components/directives就不起作用了. 那么如何保证生成的项目的components/directives前缀是您想要的呢?...查看angular-cli.json, 可以在文件的下方看到采用的是scss样式文件: ? 这样, 以后生成的component的默认样式文件就是scss了....综上, ng new 的这些参数可以在生成项目的时候作为命令的参数联合使用, 其中有一些参数也可以在项目生成以后通过修改angular-cli.json文件来做修改....执行后lint的错误减少到了一个, 看下代码: ? 接下来还会写几篇angular cli的文章.

    1.9K30

    Angular 初始化显示出大括号语法的解决方法(ngCloak)

    在做angular的SPA开发时,我们经常会遇见在如Chrome这类能够快速解析的浏览器上出现表达式({{ express }} ),或者是模块(div)的闪烁。...而对于IE7,8这类解析稍慢的浏览器大部分情况下是不会出现这个问题的。 在angular中为我们提供了ng-cloak来实现纺织闪烁的方案,我们只需要在需要的地方加上ng-cloak。...将带有ng-clock的的元素设置为display:none,隐藏掉,在等到angular解析到带有ng-clock的节点时候,会把attribute和class同时remove掉,这样就可以实现防止节点的闪烁...angular在head中加入css的速度还快呢?...(如果你也遇见了加了ng-cloak还不起作用的话,那么试试直接引入css文件吧)

    1.5K10

    实战 | Change Detection And Batch Update

    为了验证这个的猜想,我们试着在React的生命周期方法中连续调用setState 打开控制台你会发现打印了0 0,更加验证了我们的猜想,因为生命周期方法也是React调用的。...新手常碰到的一个问题就是为啥下面的代码不起作用。...如果我们不使用Angular1提供的事件系统、定时器和$http,如在jQuery事件中进行数据更新时,我们需要手动调用$apply。...例如: 同步的方法我们可以明确的知道bar什么时候执行和结束,可以在bar结束的时候调用baz。但是对于异步方法,例如: 我们无法知道foo是什么时候开始执行和结束,因为它是异步的。...React和Angular1/2都是通过获取执行上下文来进行批量更新,但是React和Angular1支持的并不彻底,都有各自的问题。

    3.2K20

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

    4.2.3、数据的有效性验证 某些时候需要对于用户输入的信息做有效性验证,此时可以在控件上添加上原生的 HTML 表单验证器来设定验证条件,当表单控件的数据发生变化时,angular 会通过指令的方式对数据进行验证...,从而生成错误信息列表 在进行用户输入数据有效性验证时,在控件上通过添加一个模板引用变量来暴露出 ngModel,从而在模板中获取到指定控件的状态信息,之后就可以通过获取错误信息列表来进行反馈 验证相同,在响应式表单中同样可以使用原生的表单验证器,在设定规则时,需要将模板中控件名对应的数据值的第二个参数改为验证的规则 在响应式表单中,数据源来源于组件类,因此应该在组件类中直接把验证器函数添加到对应的...g directive direactives/hero-validate 在创建完成指令之后,我们需要将这个指令将该验证器添加到已经存在的验证器集合中,同时为了使这个指令可以与 angular 表单集成在一起...ngOnInit(): void { } } 在针对多个字段进行交叉验证时,在模板页面中,则需要通过获取整个表单的错误对象信息来获取到交叉验证的错误信息 <div class="form-group

    18.9K20

    AngularDart4.0 指南- 表单 顶

    开发表单需要设计技巧(超出本页面的范围),以及双向数据绑定,更改跟踪,验证和错误处理的框架支持,您将在本页面上了解这些信息。 本页面向您展示了如何从头构建一个简单的表单。...向用户显示验证错误并启用/禁用表单控件。 使用模板引用变量在HTML元素之间共享信息。 您可以在Plunker中运行实例(查看源代码)并从那里下载代码。...您可以创造性地设计控件,将它们绑定到数据,指定验证规则和显示验证错误,有条件地启用或禁用特定控件,触发内置的视觉反馈等等。 Angular通过许多重复的,模板化的任务使处理过程变得简单。...显示和隐藏验证错误消息。 使用ngSubmit处理表单提交。 禁用窗体的提交按钮,直到窗体有效。 建立 按照设置说明创建一个名为表单的新项目。...概要 Angular表单为数据修改,验证等提供支持。 在此页面中,您学习了如何使用以下功能: 一个HTML表单模板和一个带有@Component注解的表单组件类。

    17.5K30

    Change Detection And Batch Update

    本文作者:IMWeb 吴浩麟 原文出处:IMWeb社区 未经同意,禁止转载 前言 在传统的WEB开发中,当与用户或服务器发生交互时,需要我们手动获取数据并更新DOM,这个过程是繁琐的、易错的。...为了验证这个的猜想,我们试着在React的生命周期方法中连续调用setState componentDidMount() { this.setState({val: 1}); console.log...新手常碰到的一个问题就是为啥下面的代码不起作用 $('#btn').on('click', function() { $scope.val = 1; }); 因为我们没有用Angular1提供的事件系统...如果我们不使用Angular1提供的事件系统、定时器和$http,如在jQuery事件中进行数据更新时,我们需要手动调用$apply。 Angular2 ?...React和Angular1/2都是通过获取执行上下文来进行批量更新,但是React和Angular1支持的并不彻底,都有各自的问题。

    3.7K70

    Change Detection And Batch Update

    本文作者:IMWeb 吴浩麟 原文出处:IMWeb社区 未经同意,禁止转载 前言 在传统的WEB开发中,当与用户或服务器发生交互时,需要我们手动获取数据并更新DOM,这个过程是繁琐的、易错的。...为了验证这个的猜想,我们试着在React的生命周期方法中连续调用setState componentDidMount() { this.setState({val: 1}); console.log...新手常碰到的一个问题就是为啥下面的代码不起作用 $('#btn').on('click', function() { $scope.val = 1; }); 因为我们没有用Angular1提供的事件系统...如果我们不使用Angular1提供的事件系统、定时器和$http,如在jQuery事件中进行数据更新时,我们需要手动调用$apply。 Angular2 ?...React和Angular1/2都是通过获取执行上下文来进行批量更新,但是React和Angular1支持的并不彻底,都有各自的问题。

    3.3K40

    AngularDart4.0 英雄之旅-教程-08HTTP 顶

    从服务器获取英雄数据。 让用户添加,编辑和删除英雄的名字。 将更改保存到服务器。 您将教会应用程序对远程服务器的Web API进行相应的HTTP调用。...你离开的地方 在前一页中,您学会了在仪表板和固定英雄列表之间导航,沿途编辑选定的英雄。 这是这个页面的起点。 在继续英雄之旅之前,请确认您具有以下结构。 ?...注意:除非您有适当配置的后端服务器(或模拟服务器),否则此应用程序不起作用。 下一节将展示如何模拟与后端服务器的交互。...调用者不知道你从(模拟)服务器获取英雄。 它像以前一样接受英雄的未来。 错误处理 在getHeroes()的结尾处,您可以捕获服务器故障并将其传递给错误处理程序。...; 在现实生活中,你会处理代码中的错误。

    11K30

    一个Angular 5教程:一步一步指导实现你的第一个Angular 5应用程序

    如果您在AngularJS中有一些背景知识,那么您知道存在控制器,指令和组件,这些控制器,指令和组件在某种程度上类似于指令但更简单,允许您升级到Angular 2.对于那些没有那种精彩体验的用户他们并找出什么地方...我们可以通过在这个过程中得到一些错误或者通过退订Observable来解决这个问题。 这里是什么takeWhile?我们在我们的组件中订阅我们的观察器。...与之前一样的故事,我们使用扩展运算符打开我们的对象和卡阵列,并将其与扩展有效载荷(来自服务器的卡,在我们的例子中)结合起来。...在大多数情况下,我们更喜欢它,因为它可以让我们获得更小的包和更快的代码。另外,请记住,AoT对您的代码质量过于严格,因此它可能会产生您以前从未见过的错误。更早地运行构建,因此更容易修复。...如果您想采取更先进的措施,请尝试使用Angular 4 Forms:由Toptaler Igor Geshoki进行嵌套和输入验证。 理解基础知识 我们为什么要使用Angular?

    42.7K10

    Angular 中的请求拦截

    在上一篇的文章 Angular 中使用 Api 代理,我们处理了本地联调接口的问题,使用了代理。 我们的接口是单独编写的处理的,在实际的开发项目中,有众多的接口,有些需要登陆凭证,有些不需要。...在使用 angular-cli 生成项目的时候,它已经自动做好了环境的区分,在 app/enviroments 目录下: environments...当然,你这里添加的内容要配合你代理上加的内容调整,读者可以自己思考验证 添加拦截器 我们生成服务 http-interceptor.service.ts 拦截器服务,我们希望每个请求,都经过这个服务..., HttpInterceptor, // 拦截器 HttpRequest, // 请求 } from '@angular/common/http'; import { Observable...console.log(error) } ) ) } } 要想拦截器生效,我们还得在 app.module.ts 上注入: // app.module.ts

    2.4K20

    Angular2 :从 beta 到 release4.0 版本升级总结

    Angular 模块是带有 @NgModule 装饰器函数的类。 @NgModule 接收一个元数据对象,该对象告诉 Angular 如何编译和运行模块代码。...它标记出该模块拥有的组件、指令和管道, 并把它们的一部分公开出去,以便外部组件使用它们。 它可以向应用的依赖注入器中添加服务提供商。 具体请参考官方文档。...date-time-picker name="start_time" [(ngModel)]="start_time" ngDefaultControl /> 六、其他问题 1. http请求内容带url时后台解析错误...升级angular(v2.4.0)到(v4.1.1)版本后,左侧导航的状态定位失效 原因:升级后,router和component的hook顺序调整(仅根据个人观察,未经验证),导致组件状态未能在路由事件结束...在webstorm里,更改文件不能在浏览器中更新输出。 原因:webstorm里面默认启用”safe write”,将保存先存到临时文件。

    8.2K00
    领券