利用angular4和nodejs-express构建一个简单的网站(七)—用户注册之ReactiveForm

news/2024/4/29 16:35:19/文章来源:https://blog.csdn.net/weixin_33747129/article/details/88882141

这一节对用户注册组件进行分析。
用户注册组件主要涉及angular4表单的操作。Angular提供了两种构建表单的技术:响应式表单和模板驱动表单。 这两项技术都属于@angular/forms库,并且共享一组公共的表单控件类。我在用户注册组件(regist.component)中使用的是响应式表单(ReactiveFormsModule),要了解更多angular表单的知识,可以访问官方文档,里面介绍的很详细。

注册组件模板分析

用户注册需要用户名、密码、邮箱(非必须)三个信息注册表单组件的模板代码如下:

<form [formGroup]="registForm" (ngSubmit)="onSubmit()" novalidate><div class="form-group"><label for="name">User name</label><input class="form-control" formControlName="name" id="name" required><div *ngIf="name.invalid && (name.dirty || name.touched)" class="alert alert-danger"><div *ngIf="name.errors.required">Name is required!</div><div *ngIf="name.errors.minlength">Name must be at least 4 characters long.</div><div *ngIf="name.errors.pattern">Name must be composed of letters, numbers</div></div></div><div class="form-group"><label for="password">Password</label><input class="form-control" formControlName="password" type="password" required id="password" #pass><div *ngIf="password.invalid && (password.dirty || password.touched)" class="alert alert-danger"><div *ngIf="password.errors.required">Password is required!</div><div *ngIf="password.errors.minlength">Password must be at least 8 characters long.</div><div *ngIf="password.errors.pattern"><!--密码必须由字母、数字、下划线和减号组成,首字母要求大写 -->Password must be composed of letters, numbers, '_', '-' and Capital letters must be capitalized.</div></div></div><div class="from-group"><label for="repassword">Re Password</label><input type="password" class="form-control" required id="repassword" (focus)="checkValid()"formControlName="repassword"><div class="alert alert-danger" *ngIf="repassword.invalid && (repassword.dirty || repassword.touched)"><div *ngIf="repassword.errors.required">Re password is required!</div><div *ngIf="repassword.errors.comparePassword">Re password must equal password!</div></div></div><div class="form-group email-group"><label for="email">Email</label><input class="form-control" formControlName="email" type="email" id="email"><div *ngIf="email.invalid &&(email.dirty || email.touched)" class="alert alert-danger"><div *ngIf="email.errors.pattern">The email address format is incorrect</div></div></div><div class="form-group form-btn"><button type="submit" class="btn btn-primary" [disabled]="registForm.invalid">Submit</button><button type="button" class="btn btn-light" [disabled]="registForm.pristine" (click)="revert()">Cancel</button></div></form>

导航到regist组件后在name、password、repassword、email中添加相应的信息,点击Submit按钮,就会触发ngSubmit事件,在form标签中定义处理ngSubmit事件的函数onSubmit(),onSubmit()函数将注册信息发送到服务器。
novalidate阻止浏览器使用原生HTML表单验证,因为这里使用了angular的表单验证。
对于响应式表单需要在模板的form标签中声明formGroup(在这里formGroup声明为registForm),还需要在输入控件(如input、select等)标签中声明formControlName。
模板中还有一些关于表单验证的内容,如下面的代码:

<div *ngIf="password.invalid && (password.dirty || password.touched)" class="alert alert-danger">...
</div>

在表单状态为dirty(脏)状态和touched(碰过)状态时如果password为invalid(不合法,表单控件不合法(invalid)表示未能满足控件的验证规则),div标识符中的内容将呈现到password控件的下方。违反了不同的验证规则,会呈现不同的内容,如在上一段代码中的div标签中还包裹着:

    <div *ngIf="password.errors.required">Password is required!</div>

表明在违反了“password.errors.required”规则时,会呈现“Password is required!”内容。
在提交按钮(Submit)上的标记[disabled]="registForm.invalid",表示当form表单有不符合验证规则的输入时,按钮不能使用。
取消输入按钮(Cancel)在控件值未发生变化时(registForm.pristine)不能使用。
模板的基本分析就到这里,下面我们来看看ts文件中的组件类。

注册组件组件类分析

注册组件的组件类设计内容较多,在这里分部进行分析。
首先要创建响应式表单并定义表单的认证规则。需要从forms模块中引入FormBuilder、 FormGroup和Validators类。

import { FormBuilder, FormGroup, Validators } from '@angular/forms';

并在构造方法中声明并初始化这三个类。

constructor(...private fb: FormBuilder,private userSer: UserService,private tokenServ: AuthTokenService) {...}

下一步利用FormBuilder创建表单。创建一个方法createForm(),用于创建表单,方法中的代码如下:

this.registForm = this.fb.group({'name': [this.user.name, [Validators.required,Validators.minLength(4),Validators.pattern(/^[a-z]|[A-Z]|[0-9]$/)]],'password': [this.user.password,[Validators.required,Validators.minLength(8),Validators.pattern(/^[A-Z][a-zA-Z0-9_-]+$/)]],'email': [this.user.email,Validators.pattern(/^([a-zA-Z0-9_\.\-]+)@([a-zA-Z0-9_\.\-]+)\.([a-zA-Z]{2,4})$/)],'repassword': [this.user.password, [Validators.required]]});

registForm是一个FormGroup的实例,关联模板中的formGroup([formGroup]="registForm"),在类中进行声明:

registForm: FormGroup;

利用FormBuilder.group来生成响应式表单,FormBuilder.group是一个用来创建FormGroup的工厂方法,它接受一个对象,对象的键和值分别是FormControl的名字和它的定义。在这个对象中对name、password、email、repassword四个FormControl进行了初始化。定义了这四个FormControl的初始值对应User类的对象user的四个同名属性(repassword对应的是user.password,用于对用户密码的重复输入进行验证)。user对象也是在类中定义的:

user: User = new User(0, '', '', '');

表单验证

在FormControl的初始化中还定义了验证规则,这个表单的验证规则由以下几种:

  • 必须输入内容(Validators.required)
  • 最少需要x个字符(Validators.minlength(x))
  • 正则验证,必须由字母、数字组成 Validators.pattern(/^[a-z]|[A-Z]|[0-9]$/)
  • 正则验证,必须由字母、数字、下划线和减号组成,首字母要求大写 Validators.pattern(/^[A-Z][a-zA-Z0-9_-]+$/)]]
  • 必须符合email格式要求,可以使用Validators.email,也可以使用正则验证。

对FormControl进行验证,还需要编写get方法来访问表单控件:

  get name() { return this.registForm.get('name'); }get password() { return this.registForm.get('password'); }get email() { return this.registForm.get('email'); }get repassword() { return this.registForm.get('repassword'); }

这里还需要自定义一个验证器,用于验证repassword输入的值是否和password的值相同。
自定义验证器由一个验证工厂函数构成。代码如下:

import { AbstractControl,ValidatorFn } from '@angular/forms';export function passwordEquals(password: string): ValidatorFn {return (control: AbstractControl): { [key: string]: any } => {const isEquals = (password === control.value);return isEquals ? null : { 'comparePassword': control.value };}
}

passwordEquals()方法需要传入一个string类型的参数,返回配置好的验证器函数。该函数接受一个Angular控制器对象,在控制器的值和参数相同时返回null,不相同时返回验证错误对象,错误对象是一个现实控件值的键值对。
将自定义验证器加到表单的repassword属性上,但因为passwordEquals()的参数需要的是password控件的值,而password控件的值不能在表单创建时拿到,需要在password控件有值后才能拿到。那么,进行自定义验证器加载的最好时机就是repassword控件获得焦点的时候。所以,在模板中要加入repassword控件的标签中加入焦点事件:(focus)="checkValid()",在处理焦点事件的checkValid()函数中,为repassword加入自定义验证规则,判断它的值是否和控件password的值相同:

checkValid() {this.repassword.setValidators([Validators.required, passwordEquals(this.pass.nativeElement.value)]);}

this.pass是通过在password的<input>组件中声明一个引用变量#pass后,通过@ViewChild('pass') pass: ElementRef;获取到password的<input>组件的值。
关于用户注册中响应式表单(ReactiveForm)的构建和验证基本上就是这些了,下一章将要介绍如何向服务器发送注册信息并导航到下一个模块。

关于angular表单验证规则和验证方法可以查看官方文档中的介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_822537.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django搭建一个小型的服务器运维网站-用户登陆与session

目录 项目介绍和源码&#xff1b; 拿来即用的bootstrap模板&#xff1b; 服务器SSH服务配置与python中paramiko的使用&#xff1b;用户登陆与session; 最简单的实践之修改服务器时间&#xff1b; 查看和修改服务器配置与数据库的路由&#xff1b; 基于websocket的实时日志实现&…

Slog63_项目上线之ArthurSlog个人网站上线2

ArthurSlogSLog-63Year1GuangzhouChinaSeptember 9th 2018ArthurSlog PageGitHubNPM Package Page掘金主页简书主页segmentfault大成若缺 其用不弊 大盈若冲 其用不穷 大直若屈 大巧若拙 大辩若讷 开发环境MacOS(High Sierra 10.13.5) 需要的信息和信息源&#xff1a; 开始编码…

37.scrapy解决翻页及采集杭州造价网站材料数据

37.scrapy解决翻页及采集杭州造价网站材料数据 1.目标采集地址: http://183.129.219.195:8081/bs/hzzjb/web/list2.这里的翻页还是较为简单的&#xff0c;只要模拟post请求发送data包含关键参数就能获取下一页页面信息。获取页面标签信息的方法不合适&#xff0c;是之前写的&am…

公司为什么一定要有自己的网站

公司为何一定要有属于自己的网站&#xff0c;网站在人们的日常生活中的作用越来越重要&#xff0c;大家买东西&#xff0c;找工作&#xff0c;旅游等等都喜欢直接在网络上解决&#xff0c;不仅省时省事&#xff0c;而且更加方便。可以毫不夸张的说&#xff0c;我们生活中90%的事…

【大型网站技术实践】初级篇:海量图片的分布式存储设计与实现

说明&#xff1a;本文是我阅读计算机工程期刊《海量图片的分布式存储及负载均衡研究》一文的学习笔记和具体实践&#xff0c;原文地址在本文底部。 一、研究背景&#xff1a;性能与资金&#xff0c;二者可兼得乎&#xff1f; 1.1 那么问题来了&#xff1f; 随着互联网的发展&am…

SEO的艺术(原书第2版)

《SEO的艺术(原书第2版)》基本信息原书名&#xff1a;The Art of SEO, Second Edition作者&#xff1a; Eric Enge Stephan Spencer Jessie Stricchiola Rand Fishkin译者&#xff1a; 姚军丛书名&#xff1a; O’Reilly精品图书系列出版社&#xff1a;机械工业出版社ISBN&…

微软没强迫?Win 10 版本号追踪网站 Buildfeed 关闭

开发四年只会写业务代码&#xff0c;分布式高并发都不会还做程序员&#xff1f; 近日&#xff0c;迫于各方压力&#xff0c;知名 Windows 10 版本号追踪网站 Buildfeed 宣布关闭。对于 Windows Insider 用户来说&#xff0c;即时获取最新 Windows 10 预览版本信息很重要&…

开发小白也毫无压力的hexo静态博客建站全攻略 - 躺坑后亲诉心路历程

目录 基本原理方法1 - 本机Windows下建站 (力荐)下载安装node.js用管理员权限打开命令行&#xff0c;安装hexo-cli和hexo下载安装git初始化hexo使用hexo generate生成静态资源在本地运行hexo&#xff0c;看一切是否正常在Coding.net创建与用户名相同的项目&#xff0c;并启用代…

机器学习实战—k近邻算法(kNN)02-改进约会网站的配对效果

示例&#xff1a;使用k-近邻算法改进约会网站的配对效果 在约会网站上使用k-近邻算法&#xff1a; 1.收集数据&#xff1a;提供文本文件。 2.准备数据&#xff1a;使用Python解析文本文件。 3.分析数据&#xff1a;使用matplotlib画二维扩散图。 4.训练算法&#xff1a;此…

php微信用户绑定网站用户

php微信用户绑定网站用户实现原理&#xff1a;因为对于每个公共号&#xff0c;每个微信用户的open_id是固定不变的&#xff0c;也就是说可以利用网站用户id与微信用户的open_id建立一一对应关系。废话不多说&#xff0c;直接看代码&#xff1a; 数据库设计如下&#xff1a; 当…

JavaScript中mouseover和mouseout多次触发解决办法

问题描述 我希望当鼠标移动到id1上的时候&#xff0c;id2显示&#xff0c;当鼠标离开id1的时候&#xff0c;id2不显示。问题如下&#xff1a; 1.当鼠标从id1上移动到id2上的时候&#xff0c;id由有显示变为不显示&#xff0c;然后变为显示 2.当鼠标从id2上移动到id1上的时候…

怎样给自己的网站添加一个在浏览器标签、地址栏左边和收藏夹上显示的缩略logo标志

问题描述 不知道&#xff0c;大家有没有注意&#xff0c;有的网站&#xff0c;地址栏上都有一个小图标&#xff0c;如csdn或者是百度。 但是我个人做的网站就没有&#xff0c;怎样添加这样的图标呢&#xff1f; 其实&#xff0c;这个是通过favicon.ico来控制的。 favicon.ico…

当修改网站上的图片等资源时怎样避免客户缓存的问题

问题分析 最近在修改网站上的logo时候&#xff0c;发现修改后&#xff0c;浏览的时候&#xff0c;还是看到之前的图片&#xff0c;PC端多多刷新几次&#xff0c;显示倒是okey&#xff0c;可是手机端依旧是原图片。很明显是缓存的问题&#xff0c;但是我又不想清除手机浏览器缓…

在window中通过IIS发布自己的网站经验总结

转自&#xff1a;https://blog.csdn.net/YSG___/article/details/69061310?utm_mediumdistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.c…

Win10下IIS配置、项目发布、添加网站

转自&#xff1a;https://study-life.blog.csdn.net/article/details/77006831?utm_mediumdistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-7.control&depth_1-utm_sourcedistribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2…

内存泄露检查工具及相关网站

Visual Leak Detector http://xiaoruanjian.iteye.com/blog/1091410 灵活自由是C/C语言的一大特色&#xff0c;而这也为C/C程序员出了一个难题。当程序越来越复杂时&#xff0c;内存的管理也会变得越加复杂&#xff0c;稍有不慎就会出现内存问题。内存泄漏是最常见的内存问题之…

源码托管网站推荐——OKSvn

在团队开发时&#xff0c;没使用SVN或者其他版本控制工具必将带来很多不必要的麻烦。在本机搭建SVN的方法虽然可行&#xff0c;但你不能保证你的电脑一直处于运行状态&#xff0c;显然是很不方便的。 我们知道&#xff0c;新浪、谷歌都有项目托管&#xff0c;由于网速…

WordPress 在主题网站添加新年快乐红灯笼特效源码样式

在春节过年的时候看到有在WordPress博客网站添加了红灯笼新年快乐样式。很有过年气氛&#xff0c;今天就给大家分享一下具体的代码样式。 WordPress主题过节灯笼 CSS 样式 这个样式代码可以加在自己的主题 css 样式文件里&#xff0c;也可以单独写进去。部分 WordPress 主题&a…

网站变灰代码,一行代码让网站整体变灰,wordpress网站一行代码全站变灰教程

在遇到特殊情况的时候&#xff0c;我们作为站长需要紧急将网站变灰的需求&#xff0c;在此小编给大家总结了几种方法&#xff0c;通过简单修改一下站点样式即可实现。一段代码让网站整体变灰。这里主要介绍的利用 filter: grayscale属性来实现。供大家学习交流。 网站变灰代码…

WordPress插件 SuperPWA让你的WordPress网站瞬间变成APP

PWA 是 Progressive Web App 的英文缩写&#xff0c; 翻译过来就是渐进式增强 WEB 应用&#xff0c; 是 Google 在 2016 年提出的概念&#xff0c;2017 年落地的 web 技术。目的就是在移动端利用提供的标准化框架&#xff0c;在网页应用中实现和原生应用相近的用户体验的渐进式…