四、表单校验

39 阅读1分钟

Angular提供了两种表单校验方式:模板驱动表单和响应式表单。两者都支持内置验证器和自定义验证器。

一、模板校验

angular 自身提供了强大的表单校验功能

  • valid: 显示该字段是否通过了所有验证规则。
  • invalid: 显示该字段是否未通过验证规则。
  • dirty: 显示用户是否修改过该字段的值。
  • touched: 显示用户是否访问过该字段(例如点击或聚焦后离开)。
  • errors: 显示当前验证失败的具体错误信息,使用json管道格式化输出
<form #form="ngForm" (ngSubmit)="onSubmit(form)">
  <div>
    <label for="name">用户名:</label>
    <input type="text"
    id="name"
    [(ngModel)]="user.name"
    name="name"
    required
    minlength="4"
    #name="ngModel"
    pattern="[a-zA-Z0-9]+"
    >
  
    <p>valid:{{name.valid}}</p>
    <p>invalid:{{name.invalid}}</p>
    <p>dirty:{{name.dirty}}</p> 
    <p>touched:{{name.touched}}</p>
    <p>errors:{{name.errors | json}}</p>
  </div>

  <div>
    <label for="password">密码:</label>
    <input type="password"
    id="password"
    [(ngModel)]="user.password"
    name="password"
    required
    minlength="6"
    #password="ngModel"
    pattern="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d@$!%*?&]{6,}$"
    >
    <p>valid:{{password.valid}}</p>
    <p>invalid:{{password.invalid}}</p>
    <p>dirty:{{password.dirty}}</p>
    <p>touched:{{password.touched}}</p>
    <p>errors:{{password.errors | json}}</p>
  </div>

  <button type="submit" [disabled]="!form.form.valid">提交</button>
</form>

二、响应式表单

1. 首先在 app.module.ts中引入FormsModule,ReactiveFormsModule

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule,ReactiveFormsModule } from '@angular/forms';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

import { AppHelloFormComponent } from './app-hello-form/app-hello-form.component';
@NgModule({
  declarations: [
    AppComponent,
    AppHelloFormComponent,
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    FormsModule,
    ReactiveFormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

2.在组件模板中

<form [formGroup]="myGroup" (ngSubmit)="onSubmit()">
  <input type="text" name="name" formControlName="name">
 <input type="text" name="password" formControlName="password">

  <button type="submit" [disabled]="!myGroup.valid">提交</button>
</form>

3.在component中

import { Component, OnInit } from '@angular/core';
import { FormGroup, FormControl, Validators } from '@angular/forms';
@Component({
  selector: 'app-app-hello-form',
  templateUrl: './app-hello-form.component.html',
  styleUrls: ['./app-hello-form.component.less']
})
export class AppHelloFormComponent implements OnInit {


  myGroup: FormGroup = new FormGroup({});
  user = {
    name: '',
    password: ''
  }
  constructor() {

  }

  ngOnInit(): void {
    this.myGroup = new FormGroup(
      {
        'name': new FormControl(this.user.name, [Validators.required, Validators.minLength(4)]),
        'password': new FormControl(this.user.password, [Validators.required, ]),

      }
    )
  }
get name(){
  return this.myGroup.get('name');
}
get password(){
  return this.myGroup.get('password')
}

  onSubmit() {
   console.log(this.myGroup.valid);
   console.log(this.name)
   console.log(this.myGroup.value)
  }
}

三、FormBuilder

借助FormBuilder 可以更加方便的表单校验

<form [formGroup]="userForm" (ngSubmit)="onSubmit()">
  <input type="text" name="name" formControlName="name">
 <input type="text" name="password" formControlName="password">

  <button type="submit" [disabled]="!userForm.valid">提交</button>
</form>
import { Component, OnInit } from '@angular/core';
import {FormBuilder, FormGroup, FormControl, Validators} from '@angular/forms';
@Component({
  selector: 'app-hello-formbuilder',
  templateUrl: './hello-formbuilder.component.html',
  styleUrls: ['./hello-formbuilder.component.less']
})
export class HelloFormbuilderComponent implements OnInit {
  userForm: FormGroup;
  constructor(private fb: FormBuilder) {
     this.userForm= this.fb.group({
      name:['11',Validators.required],
      password:['111111',Validators.required],
     })
   }

  ngOnInit(): void {
  }
  onSubmit(){

  }
}

四其他操作表单api

1. reset 重置为空或者默认数据

2. setValue 必须设置全量的数据

3. pathcValue 可以设置单个数据