表单必填_模板驱动表单Agnular高级编程(5)

Angular表单分为模板驱动表单和响应式表单。模板驱动表单采用ngModel对模板控件和组件变量进行绑定,适用于格式固定的表单。响应式表单使用FormGroup, FormControl,FormArray,FormBuilder 等类构建出数据对象,数据源操作和表单验证在组件逻辑中进行,适合格式不固定的表单。

要使用模板驱动表单,首先要在app.module.ts中引入FormsModule

import { BrowserModule } from '@angular/platform-browser';import { NgModule } from '@angular/core';import { FormsModule } from '@angular/forms';import { AppComponent } from './app.component';@NgModule({  declarations: [    AppComponent  ],  imports: [    BrowserModule, FormsModule  ],  providers: [],  bootstrap: [AppComponent]})export class AppModule { }

然后在模板中使用[(ngModel)]关联组件变量。这里使用form构建了一个表单。novalidate表示我们自己进行验证,不使用html5默认的表单验证。ngSubmit是一个表单提交事件,响应组件中的onSubmit方法。在表单内部,input我们双向绑定了组件内部的变量str,并放置了内置的验证器required,表示这个字段必填,还有minlength验证器,表示最少要填入3个字符。注意这里要用name属性指定控件的名称,这是Angular内部逻辑的需要。

<form novalidate (ngSubmit)="onSubmit()">  <div>    <input name="name" [(ngModel)]="str" required minlength="3"/>    <span> {{ str }} span>  div>  <div>    <button type="submit"> 提交 button>  div>form>

然后我们运行程序,在浏览器F12界面检查input元素,会发现如果输入3个或以上字符,input的class为ng-dirty ng-touched ng-valid,如果输入的字符少于3个,class则为ng-dirty ng-touched ng-invalid。Angular自动加上的这些类说明如下:

ng-untouched ng-touched一旦元素被访问过,则为ng-touched
ng-pristine ng-dirty元素有过更改,则为ng-dirty
ng-valid ng-invalid元素如果不满足验证规则,则为ng-invalid

然后我们在app.component.css中增加以下样式,就可以看到错误时的红框。

input.ng-dirty.ng-invalid{  border: 2px solid red;}input.ng-dirty.ng-valid{  border: 2px solid green;}

8ef8b49a216e6afe53f56d43d1ef5c90.png

默认验证器包括如下

required必填项
minlength指定最少字符数
maxlength指定最多字符数
pattern输入必须匹配正则表达式

上面的例子只是显示红色,但要获取具体的错误类型和信息,需要在input控件上指定一个模板引用变量,并赋值为ngModel。这样通过访问模板引用变量的errors属性,就可以获取错误具体信息。

<form novalidate (ngSubmit)="onSubmit()">  <div>    <input name="name" #name="ngModel" [(ngModel)]="str" required minlength="3"/>    <span> {{ str }} span>  div>  <div>    <button type="submit"> 提交 button>  div>  <div *ngIf="name.dirty && name.invalid && name.errors.required">    需要输入值  div>  <div *ngIf="name.dirty && name.invalid && name.errors.minlength">    最少输入字符:{{ name.errors.minlength.requiredLength }}  div>form>

da5dff1ba861d5380aff10c4d211bfb4.png

b3f73b4fc52444793582caf3d969c9f0.png

模板引用变量有如下验证属性

path返回元素名称
valid验证通过,则为true
invalid验证不通过,则为true
prinstine内容未更改过,则为true
dirty内容更改过,则为true
touched用户访问过此元素,为true
untouched用户未访问过该元素,为true
errors验证不通过时,返回一个对象,描述错误的信息
value元素value值

其中errors属性包括

required必填项没有填写
minlength.requiredLength返回满足minLength所需的字符数
minlength.actualLength用户实际输入字数
pattern.requiredPattern返回pattern的正则表达式
pattern.actualValue返回元素内容

除了对单个控件进行验证之外,还可以对整个表单进行验证。这时需要对表单form元素指定一个模板引用变量,赋值ngForm,在组件文件中,通过访问form模板变量的valid属性,判断表单中是否有没有验证通过的控件。只有全部控件都验证通过,form的valid属性才是true。

// app.component.html#form="ngForm" (ngSubmit)="onSubmit(form)"> ...
//app.component.tsimport { Component } from '@angular/core';import {NgForm} from "@angular/forms";@Component({  selector: 'app-root',  templateUrl: './app.component.html',  styleUrls: ['./app.component.css']})export class AppComponent {  str = '';  onSubmit(form){    if(form.valid){      console.log('valid'); //如果表单验证通过,控制台就会输出valid    }else{      form.reset();    }  }}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值