最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

Angular8基础应用之表单及其验证

来源:动视网 责编:小采 时间:2020-11-27 21:52:31
文档

Angular8基础应用之表单及其验证

Angular8基础应用之表单及其验证:一、前提 必要性:特别必要 意义:很有意义 二、正文 (一)、新建表单(模板表单) 1、新建名称为formValidator的ng项目——命令行输入ng new formValidator; 2、修改pakage.json文件——添加参数,方便开发,命令行输入npm start启动项目;
推荐度:
导读Angular8基础应用之表单及其验证:一、前提 必要性:特别必要 意义:很有意义 二、正文 (一)、新建表单(模板表单) 1、新建名称为formValidator的ng项目——命令行输入ng new formValidator; 2、修改pakage.json文件——添加参数,方便开发,命令行输入npm start启动项目;


一、前提

  • 必要性:特别必要
  • 意义:很有意义
  • 二、正文

    (一)、新建表单(模板表单)

    1、新建名称为formValidator的ng项目——命令行输入ng new formValidator;

    2、修改pakage.json文件——添加参数,方便开发,命令行输入npm start启动项目;

    "scripts": {
     "ng": "ng",
     "start": "ng serve --open --port 4210",//修改端口号&自动打开默认浏览器窗口
     "build": "ng build",
     "test": "ng test",
     "lint": "ng lint",
     "e2e": "ng e2e"
     },

    3、新建组件,命令行输入ng g c templateForm --spec false;

    4、将app.components.html中的内容,替换成<app-template-form></app-template-form>

    5、在app.module.ts中引入FormModul并在import中使用;

    6、书写formValidator组件

     //template-form.html
     <div class="container">
     <form (ngSubmit)="save()" #myForm="ngForm">
     <input 
     type="text" 
     [(ngModel)]="name" //双向数据绑定
     name="name" //使用form时必须定义,可以理解为当前控件的名字
     #myName="ngModel" //检查当前控件状态的出口,应用:myName.valid、myName.errors等
     autocomplete="off" //关闭浏览器自带的显示历史记录 h5新属性
     [appVerifyName]="nameList" //添加验证器
     >
     <!--invalid是否验证成功-->
     <!--dirty是否改变-->
     <!--touched是否被抚摸过-->
     <div *ngIf="myName.invalid && (myName.dirty || myName.touched)">
     <div *ngIf="myName.errors.required">
     名称为必填项
     </div>
     <div *ngIf="myName.errors.repeat">
     名称重复
     </div> 
     </div>
     <button type="submit" [disabled]="!myForm.form.valid">提交</button> //验证通过才能提交 
     </form>
     </div>
     //template-form.ts
     ...
     
     name: string;
     
     nameAry:string[] = ['zhangsan','lisi','wangwu'];
     
     constructor() { }
    
     ngOnInit() {}
     
     save(): void{
     console.log('save 发请求')
     }
     ...

    (二)、验证表单

    1、新建指令,用于验证ng g c d share/verifyName

    2、在share目录下新建nameValidator.ts,用于书写验证函数

     //share/nameValidator.ts
     
     import { ValidatorFn, AbstractControl } from "@angular/forms";
    
     export function nameValidator(nameList: string[]): ValidatorFn {
     return (control: AbstractControl): { [key: string]: any } | null => {
     //依据指令中传递进来的名称列表进行判断,如果包含,就返回一个对象,对象的key将
     //作为模板(template-form.html)中被验证的控件的erros的key,如果不包含返回null
     //表示验证通过
     return nameList.includes(control.value) ? { 'repeat': { value: control.value } } : null;
     };
     }

    3、书写指令——验证名称不能重复

     //verify-name.directive.ts
     
     import { Directive, Input } from '@angular/core';
     import { Validator, NG_VALIDATORS, AbstractControl } from '@angular/forms';
     import { nameValidator } from './nameValidator';
     
     @Directive({
     selector: '[appVerifyName]',
     providers: [{
     provide: NG_VALIDATORS,
     useExisting: VerifyNameDirective,
     multi: true
     }]
     })
     export class VerifyNameDirective implements Validator { //实现Validator接口
     
     @Input('appVerifyName') //接收验证规则(reg),或者你希望传到指令中的什么
     nameList: string[];
     
     validate(control: AbstractControl): { [key: string]: any } | null {
     return this.name ? nameValidator(nameList)(control) : null
     }
     }

    三、碎碎念

    如果只有一个表单或者项目比较小巧,用这样的验证机制,我认为是不太明智的(用ng都没必要),随便弄个计数器或者标识位就能达到dirty和touched的效果,反之,大概率上没有一个项目有一万个表单控件,定义9000个验证规则的,所以可以高度复用,而且维护起来也灵活一些

    总结

    文档

    Angular8基础应用之表单及其验证

    Angular8基础应用之表单及其验证:一、前提 必要性:特别必要 意义:很有意义 二、正文 (一)、新建表单(模板表单) 1、新建名称为formValidator的ng项目——命令行输入ng new formValidator; 2、修改pakage.json文件——添加参数,方便开发,命令行输入npm start启动项目;
    推荐度:
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top