在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. Java笔记(二十七)……IO流中 File文件对象与Properties类

    File类 用来将文件或目录封装成对象 方便对文件或目录信息进行处理 File对象可以作为参数传递给流进行操作 File类常用方法 创建 booleancreateNewFile():创建新文件,如果 ...

  2. 找到的两个php爬虫,分享一下

    http://www.phpdig.net/ http://www.sphider.eu/ 虽然他们的文档我都看不太懂,甚至懒得去试一下安装,但还是留着吧,以后可能用得到吧

  3. C语言结构

    一个进程在内存中的布局如图所示:        .text段(正文段)——保存程序所执行的程序二进制文件,CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令. . ...

  4. hdu5564--Clarke and digits(数位dp+矩阵快速幂)

    Clarke and digits 问题描述 克拉克是一名人格分裂患者.某一天,克拉克变成了一个研究人员,在研究数字. 他想知道在所有长度在[l,r]之间的能被7整除且相邻数位之和不为k的正整数有多少 ...

  5. POJ 2115 C Looooops(扩展欧几里得)

    辗转相除法(欧几里得算法) 时间复杂度:在O(logmax(a, b))以内 int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a ...

  6. 【原】用PHP搭建基于swoole扩展的socket服务(附PHP扩展的安装步骤及Linux/shell在线手册)

    最近公司的一项目中,需要用PHP搭建一个socket服务. 本来PHP是不适合做服务的,因为和第三方合作,需要采用高效而稳定的TCP协议进行数据通信.经过多次尝试,最终选择了开源的PHP扩展:swoo ...

  7. javascript中call和apply方法

    我们可以将call和apply看做是某个对象的方法,通过调用方法的形式来间接调用函数.call和apply的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用. 例 ...

  8. JVM之---Java内存分配参数(第四篇)

    1.内存分配参数---大纲 Ø如何设置堆内存 Ø如何设置栈内存 Ø如何设置方法区 Ø如何设置对的分配比率 Ø设置参数打印堆栈: ØJava程序的两种模式:Server&Client 2.设置堆 ...

  9. Linux为Tomecat指定JDK

    在搭建Jenkin+Sonar集成时,由于系统环境配置了jdk1.7,但是jenkins在安装sonar的插件时,需要jdk1.8.,所以需要在Tomcat指定jdk1.8. (1)暂停Tomcat ...

  10. 2015AppStore 上传步骤及常见问题

      ——————辛苦手写,转载请注明出处!——————   *************华丽分割线*****************   一.注意开发者账号:注意格式不能有一点错. 二.下载证书:生成描 ...