angular4 自定义表单组件
自定义表单组件分为单值组件和多值组件.
单值组件:input/select/radio/textarea
多值组件:checkbox/tree组件
条件:
1.必须实现ControlValueAccessor接口
不同输入控件的数据更新方式不一样。
比如input是设置value值,而checkbox是设置checked属性。
因此不同类型的输入控件都有一个ControlValueAccessor来更新视图
export interface ControlValueAccessor{
writeVlaue(obj:any) :void; //model->view
registerOnchange(fn:any) :void; //view->model
registerOnTouched(fn:any):void;
setDisabledState?( isDisabled:boolean):void
}
//实现
writeValue(value:any){
if(value!=this.innerVal){
this.innerVal=value;
}
}
2.必须注册成为表单组件(使用providers属性)
注释:
1.provide:将组件注册到DI框架,让其成为一个可被表单访问的组件
2.useExisting:让组件暴露对应的validatate方法实现表单验证
3.multi:为true时表示这个token对应多个依赖项,可在多个表单里使用,互不影响
@Component({
selector:'nw-input',
templateUrl:'./nw-input.component.html',
styleUrls:'./nw-input.component.scss',
providers:[
provide:NG_VALUE_ACCESSOR,
useExisting:forwardRef(()=>nwInputComponent),
multi:true
]
})
具体实现:
1.如果是单值表单组件,使用FormControl
//nw-select.component.ts
@Component({
selector:'nw-select',
templateUrl:'./nw-select.component.html',
styleUrls:'./nw-select.component.scss',
providers:[
provide:NG_VALUE_ACCESSOR,
useExisting:forwardRef(()=>NwSelectComponent),
multi:true
]
})
export class NwSelectComponent implements ControlValueAccessor{
selectFormControl:FormControl=new FormControl();
getControl(vfn:ValidatorFn[]):FormControl{
if(!this.selectFormControl){
this.selectFormControl=new FormControl('',vfn)
}
return this.selectFormControl
}
}
//xx.component.ts
export class xxComponent implements OnInit {
thatForm:formGroup;
@ViewChild('xxComp')
xxComp:NwSelectComponent;
ngOnInit(){
xx:this.xxComp.getControl([Validator.required,Validators.minLength(5)]) //验证条件还是数组
}
}
2.如果是多值表单组件,使用FormArray
//nw-checkbox.component.ts
@Component({
selector:'nw-checkbox',
templateUrl:'./nw-checkbox.component.html',
styleUrls:'./nw-checkbox.component.scss',
providers:[
provide:NG_VALUE_ACCESSOR,
useExisting:forwardRef(()=>NwCheckboxGroupComponent),
multi:true
]
})
export class NwCheckboxGroupComponent implements ControlValueAccessor{
checkboxFormArray:FormArray=new FormArray([]);
getControls(vfn:ValidatorFn):FormArray{
if(!this.checkboxkFormArray){
this.checkboxFormArray=new FormArray([],vfn);
}
}
cleanControls(){
while(this.checkboxFormArray.controls.length!==0){
this.checkboxFormArray.removeAt(0)
}
pushControl(id:any){
this.checkboxFormArray.push(new FormControl(id))
}
}
}
//xx.component.ts
export class xxComponent implements OnInit {
thatForm:FormGroup;
@ViewChild(xxComp)
xxComp:NwCheckboxGroupComponent;
ngOnInit(){
this.thatFom=this.formBuilder.group({
xx:this.xxComp.getControls(Valitators.required) //验证条件不再允许数组了
})
}
}
angular4 自定义表单组件的更多相关文章
- Vue组件之自定义表单组件
今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...
- 实现Ant Design 自定义表单组件
Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法 ...
- angular4 自定义表单验证Validator
表单的验证条件有时候满足不了需求就可以自定义验证 唯一要求返回是ValidatorFn export interface ValidatorFn{ (c:AbstractControl):Valida ...
- Angular4——7.表单处理
在Angular中存在两种表单处理方式: 模版驱动式表单 表单的数据模型是通过组件模版中的相关指令来定义的.由于使用这种方式定义表单的数据模型时,我们会受限于HTML的语法,所以,模版驱动方式只适用于 ...
- 【.net+jquery】绘制自定义表单(含源码)
前言 两年前在力控的时候就想做一个类似的功能,当时思路大家都讨论好了,诸多原因最终还是夭折了.没想到两年多后再这有重新提出要写一个绘制表单的功能.对此也是有点小激动呢?总共用时8.5天的时间基本功能也 ...
- Orchard创建自定义表单
本文链接:http://www.cnblogs.com/souther/p/4520130.html 主目录 自定义表单模块可以用来获取网站前台用户的信息.自定义表单需要与一个内容类型结合使用.它可以 ...
- Angular19 自定义表单控件
1 需求 当开发者需要一个特定的表单控件时就需要自己开发一个和默认提供的表单控件用法相似的控件来作为表单控件:自定义的表单控件必须考虑模型和视图之间的数据怎么进行交互 2 官方文档 -> 点击前 ...
- Winform自定义表单(转)
出处:http://www.newlifex.com/showtopic-167.aspx 好吧,附件真的损坏了,原始代码我也没有了,再提取我也没精力了,不好意思,哪位之前下过可以重发一遍吗?不过即使 ...
- ZKEACMS 自定义表单的使用
ZKEACMS Core 2.2 已经发布了,其中主要添加了自定义表单的功能.使用自定义表单的功能,您可以在几分钟内就创建一个表单,并用它来收集一些信息.导出收集的信息,就可以做一些统计分析. 创建表 ...
随机推荐
- BZOJ 3245 最快路线
和道路升级差不多,只是用的spfa; 十分有毒,在BZOJ上一直WA,对拍拍出来是一样的却告诉我不一样,然后发现自己把'\n'写成了‘\b’... #include<cstdio> #in ...
- React的PropTYpes
React的PropTYpes和获取真实DOM 组件的属性可以接受任意值,字符串,对象,函数等等都可以.有时,我们需要一种机制,验证别人使用组件时,提供的参数是否符合要求. 组件类的PropsType ...
- fiddler报错:creation of the root certificate was not successful 证书安装不成功
fiddler提示:creation of the root certificate was not successful 证书安装不成功 首先 找到Tools——>Options 在弹出的菜单 ...
- CF 1281B Azamon Web Services
原题链接:http://codeforces.com/problemset/problem/1281/B 题目大意: 给你两个字符串 s 和 c ,最多经过一次变换,使s的字典序小于c,输出变换后的s ...
- 轻量级IoC框架Ninject.NET搭建
说在之前的话 IOC的概念相信大家比较熟悉了,习惯性称之为依赖注入或控制反转,园子里对基于MVC平台IOC设计模式已经相当多了,但大家都只知道应该怎么应用一个IOC模式,比如Ninject, Unit ...
- 23-css补充
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python学习之--python概要
1 Python的优点 Python语言类库齐全,语法简洁,而且在linux上自带安装,在处理大数据以及自动化方面有其独有的特点.2 Python的解释器 Python解释器用来解释python代码, ...
- 2019-8-31-dotnet-如何在-Mock-模拟-Func-判断调用次数
title author date CreateTime categories dotnet 如何在 Mock 模拟 Func 判断调用次数 lindexi 2019-08-31 16:55:58 + ...
- str_replace函数的使用规则和案例详解
str_replace函数的使用规则和案例详解 str_replace函数的简单调用: <?php $str = '苹果很好吃.'; //请将变量$str中的苹果替换成香蕉 $strg = st ...
- redis教程(三)-----redis缓存雪崩、缓存穿透、缓存预热
缓存雪崩 概念 缓存雪崩是由于原有缓存失效(过期),新缓存未到期间.所有请求都去查询数据库,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机.从而形成一系列连锁反应,造成整个系统崩溃. 解决 ...