最近工作比较忙,一直没有更新文章。原来看别人的文章感觉很过瘾,现在自己写才发现,要坚持下去真的很难。好了,废话少说,继续吧!
这一章主要讲利用angularJs控制用户登录。在前面的用户注册表单中使用了angular的响应式表单。为了对angular的知识学习的全面一点,在用户登录的表单中,使用了模板驱动型表单。

先从html代码开始

<div class="div-login"><form (ngSubmit)="onSubmit()" #loginForm="ngForm"><div class="form-group"><label for="name">User name</label><input type="text" class="form-control" id="name" name="name" placeholder="Enter user name" [(ngModel)]="user.name" required#name="ngModel"><div *ngIf="name.invalid && (name.dirty || name.touched)"   class="alert alert-danger">User name is required!</div></div><div class="form-group"><label for="password">Password</label><div class="input-group"><input class="form-control" id="password" name="passwrod" placeholder="Enter password" [(ngModel)]="user.password"required #password="ngModel"></div><div *ngIf="password.invalid && (password.dirty || password.touched)" class="alert alert-danger">Password is required!</div></div><div class="form-group form-btn"><button type="submit" class="btn btn-primary" [disabled]="!loginForm.form.valid">Submit</button><button type="button" class="btn btn-light" (click)="loginForm.reset()">Cancel</button></div></form>
</div>

在这个html文件的<form>标签中,(ngSubmit)="onSubmit()"和用户注册表单一样,用于处理表单的提交操作,为了实现在表单不合法时提交按钮的disabled为false,需要让按钮能够访问到表单,从而获取到表单的状态,所以,需要在<form>标签中定义了一个模板引用变量 #loginForm,并且把赋值为“ngForm”,同时在submit按钮标签中加入:[disabled]="!loginForm.form.valid"
两个<input>标签分别输入用户名和密码,通过ngModel创建双向绑定到组件类的User对象的name和password属性,用于读取和写入输入控件的值。这里需要注意一点:当在表单中使用 [(ngModel)] 时,必须要定义 name 属性
模板驱动表单的验证都在html代码中实现,需要完成以下几项任务:

  • 首先要定义模板引用变量,并赋值为"ngModel",注意观察<input>标签中的 #name="ngModel"和#password="ngModel"。
  • 两个用户名和密码的验证规则比较简单,只需required,在两个<input>标签中加入此属性。
  • 显示验证错误信息和注册表单差不多,当模板引用变量即两个输入框变为dirty(控件值变化了)和touched(控件值被访问过)状态时,如果控件值无效(invalid),就显示<div>标签包裹的内容。

html部分的内容就这些了,下面我们看一下控件类的内容。

控件类

先把代码放出来,后面慢慢分析。

@Component({selector: 'app-login',templateUrl: './login.component.html',styleUrls: ['./login.component.css']
})
export class LoginComponent {user: User = new User(0, '', '', '');constructor(private route: Router,private jumService: JumbotronServive,private userServ: UserService,private tokenServ: AuthTokenService) {jumService.setJumbotron(new Jumbotron('Login',`Please login with your user name and password first`,``));}onSubmit() {this.userServ.getUser(this.user).subscribe((resp) => {this.tokenServ.setToken(resp.body['token']);this.route.navigate(['/birthday']);alert('登录成功!');},(err)=>alert(this.userServ.handleError(err)),() => console.log('The Post observable is now completed. '))}
}

控件类主要完成了如下功能:

  • 首先初始化了一个User类的对象,用于ngModel双向绑定到控件。保证在html控件值变化时,绑定的User类的属性同步变化。
  • 在构造函数中声明了一个Router对象、一个JumbotronServive对象和UserService对象、AuthTokenService对象。并在构造函数中用JumbotronServive的setJumbotron方法更新了网页的标题。(JumbotronServive的setJumbotron方法具体内容请看前面的文章。)
  • onSubmit()函数在表单提交时被触发,在该函数中UserService的getUser()函数,getUser()函数向服务器发送了用户名和密码,如果服务器验证成功,会发送回jwt认证信息的token字符串,其中包括了userid。在onSubmit()函数中调用AuthTokenService的setToken()函数,将这个字符串存储到本地存储,用于导航到下一个页面(生日页面)时验证用户信息。接下来导航到下一个页面,并提示用户登录成功。如果发生错误,提示错误原因。

用户登录主要的内容就这些了。其中还有一个小技巧性的东西就是在输入密码的时候,因为<input>标签的type=password,显示的输入内容为“.”,很容易输错。我在这个控件上放了一个可以切换的图片,用于让用户选择是否查看明文。实现的方法主要是改变<input>控件的attr属性。如果需要具体实现方法的朋友,可以给我留言,我会在回复中告诉大家。

利用angular4和nodejs-express构建一个简单的网站(九)—用户登录相关推荐

  1. 利用angular4和nodejs-express构建一个简单的网站(六)—用户模块和路由分析

    上一节解决了用户注册和登录数据部分的内容.这一节开始分析用户模块.用户路由.## 用户管理模块UserModule分析 ## UserModule主要代码如下: import { NgModule } ...

  2. python推荐系统-利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  3. 基于python的系统构建_利用python构建一个简单的推荐系统

    摘要: 快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫. 本文将利用python构建一个简单的推荐系统,在此之前读者需要对pandas和numpy等数据分析包有所了解. 什 ...

  4. python推荐_利用Python构建一个简单的推荐系统

    原标题:利用Python构建一个简单的推荐系统 摘要:快利用python构建一个属于你自己的推荐系统吧,手把手教学,够简单够酷炫.在此之前读者需要对pandas和numpy等数据分析包有所了解. 什么 ...

  5. 如何构建一个简单的语音识别应用程序

    "In this 10-year time frame, I believe that we'll not only be using the keyboard and the mouse ...

  6. 基于ForkJoin构建一个简单易用的并发组件

    2019独角兽企业重金招聘Python工程师标准>>> 基于ForkJoin构建一个简单易用的并发组件 在实际的业务开发中,需要用到并发编程的知识,实际使用线程池来异步执行任务的场景 ...

  7. LabWindows_CVI测试技术及工程应用_学习笔记1(构建一个简单的程序)

    构建一个简单的程序 1.创建工程文件 或File--〉New--〉Project(*.prj),默认名Untitled.prj,存储在Unititled.cws的工作空间中 File--〉Save U ...

  8. 通过python 构建一个简单的聊天服务器

    构建一个 Python 聊天服务器 一个简单的聊天服务器 现在您已经了解了 Python 中基本的网络 API:接下来可以在一个简单的应用程序中应用这些知识了.在本节中,将构建一个简单的聊天服务器.使 ...

  9. 知识图谱实战应用11-基于py2neo构建一个简单的问答功能

    大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用10-基于py2neo构建一个简单的问答功能,利用知识图谱来实现智能的问答功能.知识图谱是一种用于表示实体之间关系的图形化模型,它是人工智能和自 ...

最新文章

  1. 三维渲染引擎设计与实践(四)
  2. Spring学习总结(一)——Spring实现IoC的多种方式
  3. odoo12 mysql_odoo12从零开始:二、1)个性化定制odoo12之修改数据库创建页面
  4. java导出数据透视表_使用数据库中的Java流制作数据透视表
  5. linux终端炫酷命令,你不得不知道11个炫酷的 Linux 终端命令
  6. Visio 2007中进行数据库建模时如何显示字段类型以及概念名称
  7. “JavaSwing” ——简单使用
  8. 正确的修改web项目的名字
  9. 卧式储罐液位体积计算公式excel_2020晋中化工防腐储罐订做欢迎来电-环保设备...
  10. 设计师和程序员-拓展知识关系网
  11. GitHub上10个有趣的开源小游戏(附加在线演示)
  12. opendrive中的Road
  13. 产品经理的自我修养:认知模式
  14. Xilinx HLS 学习笔记1
  15. Php 实现在文档只读功能,如何将只读文档变成可编辑模式?
  16. Windows 系统自带的文件同步工具
  17. JQuery实现复选框CheckBox的全选、反选、提交操作
  18. 暗影骑士vn7安装linux,宏碁暗影骑士一代(VN7-591G)拆机清灰教程
  19. 【转载】音频基础知识
  20. jupyter notebook ModuleNotFoundError: No module named ‘tensorflow‘---爬出坑

热门文章

  1. 三十而立,立的是什么?(r11笔记第70天)
  2. Linux文件系统大杂烩
  3. 国外程序员收集整理的PHP资源大全
  4. 关于跨域策略文件crossdomain.xml文件
  5. VirtualCopy in WinCE6.0
  6. linux mysql 升级_linux升级mysql
  7. spring el表达式解析_Spring之旅第一篇-初识Spring
  8. 域名判断真实ip地址
  9. solidworks钣金插件_高效掌握SolidWorks钣金零件加工设计概念
  10. JButton 圆角_ProE、Creo在玩具轿车设计中的一个案例应用解析|轿车|玩具|圆角