如何在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 的集成实在是太棒了!但 ...
随机推荐
- tmux快捷键`
Ctrl+b 激活控制台:此时以下按键生效 系统操作 ? 列出所有快捷键:按q返回 d 脱离当前会话:这样可以暂时返回Shell界面,输入tmux attach能够重新进入之前的会话 D 选择要脱离的 ...
- HW4.8
import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...
- HDOJ-ACM1004(JAVA)
转载声明:原文转自http://www.cnblogs.com/xiezie/p/5502876.html JAVA语言实现: 拿到题目第一反应是用HashMap实现,但是感觉用HashMap实在太浪 ...
- HDU2639Bone Collector II(01背包变形)
01背包,求第k大. 以前看k短路的时候看过代码以为懂了 = =结果还是跑去看了别人的代码才会.果然要自己写一遍才行啊 0.0难得1A.. 每次把可能的2k种求出来,求前k个.注意要不一样的k个数.. ...
- usb 设备的端点 及输入输出方向
- bug,不该怕~敢敢test就是了
转载自:http://bbs.itcast.cn/thread-10103-1-1.html 当程序员的经历让我知道了一些关于软件编程的事情.下面的这些事情可能会让朋友们对软件开发感到惊讶: 一个程序 ...
- 关于IOS中UIWebView 加载HTML内容
NSString *strContent=[info objectForKey:@"newContent"]; { NSArray *paths = NSSearchPathFor ...
- Android解析Json速度最快的库:json-smart
场景描写叙述: 本文仅验证了在安卓环境下使用Json的Key作为反序列化条件的解析速度.结论是解析速度最快的不是阿里的fastjson,也不是Google的Gson,而是json-smart. And ...
- android点滴之标准SD卡状态变化事件广播接收者的注冊
眼下最完整的,须要注冊的动作匹配例如以下: IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_MOUNTED); int ...
- TOMCAT 集群之 PERSISTENT SESSION
tomcat的session保存在数据库中,不是很复杂,写下来供大家参考. 准备工作: 两架Ubuntu Server 12.04 64位,确定两级服务器可以互相ping的通并属于同一个网段 安装jd ...