如何在Angular2中使用Forms
在Angular2中形成两个基本对象是Control
和ControlGroup
。
控制用户输入 Control
一个控制
表示一个输入字段(ngFormControl)
一个控制可以绑定到一个input元素,并采取3个参数(所有可选); 默认值,验证程序和异步验证。
import {Component} from '@angular/core'; import {Control} from '@angular/common'; import 'rxjs/Rx'; @Component({ selector: 'my-app', template: ` <div> <h2>ngFormControl</h2> <input type="text" [ngFormControl]="term"/> </div> ` }) export class App { public term = new Control(); constructor(){ this.term.valueChanges .debounceTime() .distinctUntilChanged() .subscribe(data=>conosle.log(data)) } }
debounceTime(400) 延时400ms输出
distinctUntilChanged() 直到停止键盘输入触发
subscribe() 监控输入框值得变化
控制组
大多数表单都有多个字段,所以我们需要一种方法来管理多个控制,我们使用Angular2的“FormBuilder”类多个控制结合起来。
import {Component , ViewChild ,ElementRef } from '@angular/core'; import {FORM_PROVIDERS, FormBuilder, Validators ,Control} from '@angular/common'; import 'rxjs/Rx'; @Component({ template :` <div style="padding-top: 10rem;"> <form [ngFormModel]="userForm" (submit)="saveUser()"> <ul> <li><input type="text" [ngFormControl]="term"/> {{term.value}}</li> <li><input type="text" [ngFormControl]="email"/> {{email.value}}</li> </ul> <button type="submit" [disabled]="!userForm.valid">Submit</button> </form> </div> ` }) export class FormComponent { public userForm: any; public term = new Control('',Validators.required); public email = new Control('',Validators.required) constructor(public formBuilder: FormBuilder){ this.userForm = this.formBuilder.group({ term : this.term, email : this.email }) this.term.valueChanges .debounceTime() .distinctUntilChanged() .subscribe(data=> console.log(this.userForm.valid)) } saveUser() { if (this.userForm.dirty && this.userForm.valid) { alert(`email: ${this.userForm.value.email}`); alert(`email: ${this.userForm.value.email}`); } } }
上面的ControlGroup使用ngFormModel指令,绑定到您的应用中。
<form [ngFormModel]="userForm" (submit)="saveUser()">
内置表单验证
Angualr2提供了三种内置的验证:
- Required
- minLength
- maxLength
));
对应的Html是:
<li> <input type="text" [ngFormControl]="name"/> {{name.value}} <div *ngIf="!name.vaild"> <span *ngIf="name.errors.maxlength">您输入的字数不对</span> </div> </li>
自定义表单验证
class UsernameValidator { publick startsWithNumber(control){ )) ){ return { “startsWithNumber”: true }; } return null; } }
您可能会注意到一个奇怪的是,返回null实际上意味着验证是有效的。
我们可以在我们的控制使用上面的验证器
this.name = new Control('', UsernameValidator.startsWithNumber);
多重校验
Angular2提供了两种方法来验证程序,Validators.compose和Validators.composeAsync。
综合以上的:
validation.service.ts
import {Injectable} from '@angular/core' @Injectable() export class ValidationService { emailValidator(code){ if(code.value != ""){ if(/^(\w)+(\.\w+)*@(\w)+((\.\w+)+)$/.test(code.value)){ return null; }else{ return {'invalidEmailAddress': true }; } } } passwordValidator(code){ return new Promise((resolve, reject) => { setTimeout(() => { if (code.value == "David") { resolve({"usernameTaken": true}) } else { resolve(null); }; }, ); }); } }
form.component.ts
import {Component , ViewChild ,ElementRef } from '@angular/core'; import {FORM_PROVIDERS, FormBuilder, Validators ,Control} from '@angular/common'; import 'rxjs/Rx'; import {ValidationService} from './validation.service' @Component({ template :` <div style="padding-top: 10rem;"> <form [ngFormModel]="userForm" (submit)="saveUser()"> <ul> <li> <input type="text" [ngFormControl]="username"/> <div *ngIf="!username.valid"> <span *ngIf="username.errors.required"> 请输入用户名 </span> <span *ngIf="username.errors.minlength"> 用户名不能少于6位 </span> <span *ngIf="username.errors.maxlength"> 用户名不能大于10位 </span> </div> </li> <li> <input type="text" [ngFormControl]="password"/> <div *ngIf="!password.valid && !password.pending"> <span *ngIf="password.errors.required"> 请输入密码 </span> <p *ngIf="password.errors.usernameTaken">This username is taken</p> </div> </li> <li> <input type="text" [ngFormControl]="email"/> <div *ngIf="!email.valid"> <span *ngIf="email.errors.required"> 请输入邮箱地址 </span> <span *ngIf="email.errors.invalidEmailAddress"> 请输入正确的邮箱地址 </span> </div> </li> </ul> <button type="submit" [disabled]="!userForm.valid">Submit</button> </form> </div> `, providers : [ValidationService] }) export class FormComponent { public userForm: any; ),Validators.maxLength()])); public password = new Control('',Validators.compose([Validators.required]),this.validationService.passwordValidator) public email = new Control('',Validators.compose([Validators.required ,this.validationService.emailValidator])) constructor(public formBuilder: FormBuilder , public validationService:ValidationService ){ this.userForm = this.formBuilder.group({ username : this.username, password : this.password, email : this.email }) this.username.valueChanges .debounceTime() .distinctUntilChanged() .subscribe(data=> console.log(this.username.errors)) } saveUser() { console.log(this.userForm.valid); if (this.userForm.dirty && this.userForm.valid) { alert(`email: ${this.userForm.value.email}`); alert(`email: ${this.userForm.value.email}`); } } }
如何在Angular2中使用Forms的更多相关文章
- Angular杂谈系列1-如何在Angular2中使用jQuery及其插件
jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...
- 如何在Angular2中使用jquery
首先在index.html中引入jquery文件 <script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.js"> ...
- 如何在 ASP.Net Web Forms 中使用依赖注入
依赖注入技术就是将一个对象注入到一个需要它的对象中,同时它也是控制反转的一种实现,显而易见,这样可以实现对象之间的解耦并且更方便测试和维护,依赖注入的原则早已经指出了,应用程序的高层模块不依赖于低层模 ...
- 我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧
做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...
- 如何在latex 中插入EPS格式图片
如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...
- 如何正确的使用json?如何在.Net中使用json?
什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...
- [原创]如何在Parcelable中使用泛型
[原创]如何在Parcelable中使用泛型 实体类在实现Parcelable接口时,除了要实现它的几个方法之外,还另外要定义一个静态常量CREATOR,如下例所示: public static cl ...
- 如何在springMVC 中对REST服务使用mockmvc 做测试
如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试 spring 集成测试中对mock 的集成实在是太棒了!但 ...
随机推荐
- 转移python
这段时间一直学python,工作需要做一个基于python的web管理系统,恶补Django. 之前一直觉得开发人员只需要掌握了某个技术就OK了,没有重视总结学习的知识,最近经历的事情让我改变了之前的 ...
- jsp网站与discuz论坛用户同步
需求分析: 要想实现A(jsp网站)和B(discuz论坛)的同步,这里说的同步指的是 在AB网站任意一方注册之后在另一方都可以直接登录 AB两网站之间的用户登陆状态是同步的,在任意一方登录后,另一方 ...
- Prime Land
http://poj.org/problem?id=1365 题意:给定一个数字n的拆分形式,然后让你求解n-1的值: 解析:直接爆搞 // File Name: poj1365.cpp // Aut ...
- hdu4433 locker
暴力dp.. dp[i][j][k] 表示 前i位完全匹配 j 表示i+1位 k表示i+2位 枚举j k #include<iostream> #include<cstdio> ...
- 展开/收缩 ul
了一个展开收缩的东东,留着以后万一用到 后台递归生成的函数(这里是一个反射参数展示,支持多层级展开显示,后台反射如何多层级解析的方法有时间再补上吧) /// <summary> /// 递 ...
- jQuery中get与eq的区别
get与eq的区别 .eq() 减少匹配元素的集合,根据index索引值,精确指定索引对象. .get() 通过检索匹配jQuery对象得到对应的DOM元素. 同样是返回元素,那么eq与get有什么区 ...
- chrmoe debug
一.右击,点击审查元素 二.打开后,每个tab是干什么用的呢? 三.调试样式 选中Elemes后,右边有个窗口,这里是CSS的样式,可以直接选中元素,并且在这里修改样式.这样调试很方便,效率也很高.当 ...
- MS-SQLSERVER中的MSDTC不可用解决方法
今天在本地机直接在触发器里更新还有一台服务器数据时出现: MSDTC不可用 解决的方法: 在windows控制面版-->管理工具-->服务-->Distributed Tra ...
- 总结swift语言常见的20个问题和回答
1.假设我是个刚入门的iOS开发人员,选swift学习呢,还是选objective-c学习,还是两个都学? 这个能够依据两种情况来决定:1.我想进入公司担任iOS开发的职位 2.我仅仅想做个独立 ...
- Monitoring and Tuning the Linux Networking Stack: Receiving Data
http://blog.packagecloud.io/eng/2016/06/22/monitoring-tuning-linux-networking-stack-receiving-data/ ...