原文

https://www.jianshu.com/p/da1fd5396798

大纲

  1、模板驱动表单的创建
  2、响应式表单的创建
  3、模板驱动型表单的自定义指令
  4、响应式表单的自定义指令
  5、父组件向子组件传递表单控制
  6、代码素材

模板驱动表单的创建

//1、在根模块注入依赖模块
import { FormsModule } from '@angular/forms';
//2、在模板中创建表单控件
<form>
<div class="form-group">
<label class="center-block">Name1:
<input class="form-control">
</label>
</div>
<div class="form-group">
<label class="center-block">Age1:
<input class="form-control">
</label>
</div>
</form>
//3、在模板中添加ngModel同步数据
//4、数据校验:模板型表单的数据校验是写在模板上的,
//将require、minlength等校验规则写在模板上,从而定义对应表单控件的校验规则
//5、表单的提交,可以通过提交被监控的表单的值来达到表单的提交
//6、可以自定义设置表单数据的校验

响应式表单的创建

//1、在根模块注入依赖模块,引入ReactiveFormsModule
import { ReactiveFormsModule } from '@angular/forms';
//2、在模板中创建form表单
//3、在组件中创建响应式表单控制器
ReactiveForm = new FormGroup({
age: new FormControl('',[Validators.required])
});
//4、监控表单的值的变化
/*
a:数据模型的值的变化:这里同样需要ngModel来绑定数据模型和表单模型的值,
不过需要注意的是,如果用ngModel来绑定表单控件,
那么通过new FormControl设置的默认值可能就会被ngModel的默认值给覆盖了
b:表单模型的值的变化:可以通过监控{{ReactiveForm.value.age}}来监控值的变化
*/
//5、数据的校验
/*
各个表单控件的数据的校验是需要通过FormControl来设置的,
可以看到每个new FormControl后都可以对各个表单控件进行数据的校验。
*/
//6、表单的提交
/*
(ngSubmit)="onSubmit(user)"通过ngSumbit即可实现表单数据的提交,
user是表单的名字,即:[formGroup]="user"
*/
//7、可以自定义设置表单数据的校验

模板驱动型表单的自定义指令

  模板型表单校验需要通过模板中添加属性才可以添加验证,所以需要继承指令Directive,在Directive中定义元数据并添加一系列的自定义的表单校验规则。

/**
equalCrk.direvtive.ts
使用:
<input name="nickName" id="nickName" [(ngModel)]='nickName' validateCrk>
当输入的数据不是crk的时候,表单的校验是不会通过的
**/
import { Directive, forwardRef, Attribute } from '@angular/core';
import { NG_VALIDATORS, Validator, AbstractControl } from '@angular/forms'; @Directive({
selector: '[validateCrk][ngModel]',
providers: [
{
provide: NG_VALIDATORS,
useExisting: forwardRef(() => CrkValidatorDirective),
multi: true
}
]
})
export class CrkValidatorDirective implements Validator {
constructor(
@Attribute('validateCrk') public validateCrk: string) {
}
validate(c: AbstractControl): { [key: string]: any } {
// 控件自身值
const self = c.value;
// 控件的值是否等于'crk'
if (self !== 'crk') {
return {
validateCrk: true
};
}
return null;
}
}

响应式表单的自定义指令

  响应式的自定义校验相对来说较简单,需要满足ValidatorFn即可。

/**
响应式表单自定义指令
使用:
{validator: [this.validateEqualCrk('nickName','gg')]}
*/
validateEqualCrk(confirmKey: string, confirmStr?:string): ValidatorFn {
return (group: FormGroup): {[key: string]: any} => {
const confirmField = group.controls[confirmKey];
const pattenStr = confirmStr ? confirmStr : 'crk'
if (confirmField.value !== pattenStr) {
return {
validateEqualCrk: true
};
}
return null;
};
}

父组件向子组件传递表单控制

  当表单中某个字段是以子组件的形式出现的时候,不能直接设置FormControl,因此需要向子组件传递FormControl然后在子组件添加,这样才可以实现父组件表单对子组件表单元素的控制。

代码素材

  你可以在以下git代码中找到我上述讲述的知识点的实例代码(angular的实例代码中的angular-form)代码中对如何创建模板驱动型表单,响应式表单、使用FormBuilder创建响应式表单、创建自定义指令(响应式表单的和模板驱动表单的自定义指令都有)以及深层次传递表单控制等知识点都有涉及到。

angular表单的使用实例的更多相关文章

  1. angular表单经验分享

    原文 https://www.jianshu.com/p/af359bd04f32 大纲 1.表单的名字不可以和传入的值的名字相同 2.在模板驱动表单的时候要使用angular表单的验证功能,需要将n ...

  2. Angular表单 (一)表单简介

    Angular 表单 angular提供了两种不同的方法来通过表单处理用户输入:响应式表单和模板驱动表单.二者都从视图中捕获用户输入事件.验证用户输入.创建表单模型.修改数据模型,并提供跟踪这些更改的 ...

  3. 【干货】Laravel --Validate (表单验证) 使用实例

    前言 : Laravel 提供了多种方法来验证应用输入数据.默认情况下,Laravel 的控制器基类使用ValidatesRequests trait,该trait提供了便利的方法通过各种功能强大的验 ...

  4. Angular 表单(二) - 模板驱动表单

    import { Component, OnInit } from '@angular/core'; import { Hero} from '../hero'; @Component({ selec ...

  5. jquery实现表单验证简单实例

    /* 描述:基于jquery的表单验证插件. */ (function ($) { $.fn.checkForm = function (options) { var root = this; //将 ...

  6. PHP通过session判断防止表单重复提交实例

    PHP通过session判断防止表单重复提交实例,当用户提交表单后,为防止重复操作,通过session来判断是否为初次提交,否则让他返回到之前表单页面. 当前表单页面is_submit设为0 SESS ...

  7. Angular 表单验证类库 ngx-validator 1.0 正式发布

    背景介绍 之前写了一篇 <如何优雅的使用 Angular 表单验证>,结尾处介绍了统一验证反馈的类库  ngx-validator  ,由于这段时间一直在新模块做微前端以及相关业务组件库, ...

  8. angular表单验证实例----可用的代码

    前段时间,公司做一个单页面,就是一个表单验证,早开始在菜鸟教程上关注了angular,所以下派上用场了 angular里面对于表单验证,设置了很多指令. 也就是说不用自己写一些逻辑,直接绑定指令就行. ...

  9. angular 响应式表单(登录实例)

    一.表单验证 1. 只有一个验证规则: this.myGroup = this.fb.group({ email:['hurong.cen@qq.com',Validators.required], ...

随机推荐

  1. 爬虫爬数据时,post数据乱码解决的方法

    近期在写一个爬虫,目标站点是:http://zx.bjmemc.com.cn/.可能是为了防止被爬取数据,它给自身数据加了密. 用谷歌自带的抓包工具也不能捕获到数据. 于是下了Fiddler.     ...

  2. Appium IOS 自己主动化測试初探

    手机平台的自己主动化測试工具非常多,之前研究过了安卓和苹果的原生自己主动化測试框架.经一些同事介绍,貌似Appium是个不错的工具. 想记录一下研究的结果,也算是篇干货的文章 在网上也看了一些视频.个 ...

  3. Funui-Theme 资源的替换

    实现资源的替换,需要分为以下几个步骤 1.找到需要更改的模块 mediatek/packages/apps/FileManager 2.到主题模块下根据包名找到相应资源(以Grass为例) cd ve ...

  4. PHP中字符串比较的常用方法

    PHP中字符串比较的常用方法 一.总结 1.其实应该是直接等于号就可以了的 2.也可用strcmp,注意返回值 二.PHP中字符串比较的常用方法 1.按字节比较 按字节比较字符串是最常用的方法.其中可 ...

  5. Zabbix监控告警

    一 钉钉告警 1.1.1 添加钉钉机器人 发起群聊 创建完群聊选择,机器人管理 选择你要绑定的群聊 复制下面地址留用 1.1.2 编写钉钉告警脚本 安装requests库,HTTP客户端, # yum ...

  6. 记Bootstrap Table两种渲染方式

    这里主要区别两种Bootstrap Table的数据渲染方式,一.属性渲染方式,二.JS渲染方式 工作直接接手前人的,之前都直接在table标签上渲染属性,后面因为项目需要,同一页面的表格,需要申请不 ...

  7. Codeforces 451 E. Devu and Flowers(组合数学,数论,容斥原理)

    传送门 解题思路: 假如只有 s 束花束并且不考虑 f ,那么根据隔板法的可重复的情况时,这里的答案就是 假如说只有一个 f 受到限制,其不合法时一定是取了超过 f 的花束 那么根据组合数,我们仍然可 ...

  8. http压测工具wrk

    安装 wrk支持大多数类UNIX系统,不支持windows.需要操作系统支持LuaJIT和OpenSSL,不过不用担心,大多数类Unix系统都支持.安装wrk非常简单,只要从github上下载wrk源 ...

  9. IOS开发UI基础--数据刷新

    IOS开发UI基础--数据刷新 cell的数据刷新包括下面几个方面 加入数据 删除数据 更改数据 全局刷新方法(最经常使用) [self.tableView reloadData]; // 屏幕上的全 ...

  10. Python 极简教程(四)变量与常量

    变量和常量 在 Python 中没有 常量 与 变量 之分.只有约定成俗的做法: 全大写字母的名称即为 常量: PI = 3.1415926 全小写字母的名称为 变量: name = 'nemo' 变 ...