在Angular2中形成两个基本对象是ControlControlGroup

控制用户输入 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的更多相关文章

  1. Angular杂谈系列1-如何在Angular2中使用jQuery及其插件

    jQuery,让我们对dom的操作更加便捷.由于其易用性和可扩展性,jQuer也迅速风靡全球,各种插件也是目不暇接. 我相信很多人并不能直接远离jQuery去做前端,因为它太好用了,我们以前做的东西大 ...

  2. 如何在Angular2中使用jquery

    首先在index.html中引入jquery文件 <script src="http://cdn.bootcss.com/jquery/2.1.3/jquery.js"> ...

  3. 如何在 ASP.Net Web Forms 中使用依赖注入

    依赖注入技术就是将一个对象注入到一个需要它的对象中,同时它也是控制反转的一种实现,显而易见,这样可以实现对象之间的解耦并且更方便测试和维护,依赖注入的原则早已经指出了,应用程序的高层模块不依赖于低层模 ...

  4. 我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  5. 如何在SpringBoot中使用JSP ?但强烈不推荐,果断改Themeleaf吧

    做WEB项目,一定都用过JSP这个大牌.Spring MVC里面也可以很方便的将JSP与一个View关联起来,使用还是非常方便的.当你从一个传统的Spring MVC项目转入一个Spring Boot ...

  6. 如何在latex 中插入EPS格式图片

    如何在latex 中插入EPS格式图片 第一步:生成.eps格式的图片 1.利用visio画图,另存为pdf格式的图片 利用Adobe Acrobat裁边,使图片大小合适 另存为.eps格式,如下图所 ...

  7. 如何正确的使用json?如何在.Net中使用json?

    什么是json json是一种轻量级的数据交换格式,由N组键值对组成的字符串,完全独立于语言的文本格式. 为什么要使用json 在很久很久以前,调用第三方API时,我们通常是采用xml进行数据交互,但 ...

  8. [原创]如何在Parcelable中使用泛型

    [原创]如何在Parcelable中使用泛型 实体类在实现Parcelable接口时,除了要实现它的几个方法之外,还另外要定义一个静态常量CREATOR,如下例所示: public static cl ...

  9. 如何在springMVC 中对REST服务使用mockmvc 做测试

    如何在springMVC 中对REST服务使用mockmvc 做测试 博客分类: java 基础 springMVCmockMVC单元测试  spring 集成测试中对mock 的集成实在是太棒了!但 ...

随机推荐

  1. Drupal安装及使用问题解决列表

    #1. 启动 Clean URL 修改Apache的配置文件(如httpd.conf),打开 LoadModule rewrite_module modules/mod_rewrite.so选项.然后 ...

  2. Spring ’14 Wave Update: Installing Dynamics CRM on Tablets for Windows 8.1

    One of the added bonuses of Dynamics CRM is its ability go where you go! With the Spring ’14 Wave Up ...

  3. 从java程序员到CTO的成长路线图

    很多新人不知道从事java开发,具体的发展路径是怎么样的,甚至很多人都不能区分程序猿和攻城师的区别.包括不少小白,从事java开发都半年,甚至1年了,对职业发展还没有清晰的认证.这非常不利于自己的发展 ...

  4. CentOS搭建VSFTP

    1.先看看有没有安装 rpm -qa | grep vsftpd 如果没有提示,说明没有安装.接下来,我们安装一个ftp. 2.yum安装vsftpd: yum -y install vsftpd 安 ...

  5. ActiveMQ内存设置和流控

    启动脚本设置jvm的内存 if "%ACTIVEMQ_OPTS%" == "" set ACTIVEMQ_OPTS=-Xms1G-Xmx1G -Djava.ut ...

  6. iframe与include的区别

    iframe与include区别和使用问题 1.iframe可以用在静态和动态页面,include只能用在动态页面. 2.iframe是视图级组合,include是代码级组合. 3.iframe独立成 ...

  7. 【面试虐菜】—— Oracle中CHAR、VARCHAR的区别

    1.CHAR. CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取 ...

  8. HTML中Select的使用具体解释

    <html> <head> <SCRIPT LANGUAGE="JavaScript"> <!-- //oSelect 列表的底部加入了一 ...

  9. hadoop备记

    Hadoop 的优势 Hadoop 是 一 个 能 够 让 用 户 轻 松 架 构 和 使 用 的 分 布 式 计 算 平 台. 用 户 可 以 轻 松 地 在Hadoop 上开发执行处理海量数据的应 ...

  10. UVA 185(暴力DFS)

      Roman Numerals  The original system of writing numbers used by the early Romans was simple but cum ...