自定义表单组件分为单值组件和多值组件.

单值组件: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 自定义表单组件的更多相关文章

  1. Vue组件之自定义表单组件

    今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...

  2. 实现Ant Design 自定义表单组件

    Ant Design 组件提供了Input,InputNumber,Radio,Select,uplod等表单组件,但实际开发中这是不能满足需求,同时我们希望可以继续使用Form提供的验证和提示等方法 ...

  3. angular4 自定义表单验证Validator

    表单的验证条件有时候满足不了需求就可以自定义验证 唯一要求返回是ValidatorFn export interface ValidatorFn{ (c:AbstractControl):Valida ...

  4. Angular4——7.表单处理

    在Angular中存在两种表单处理方式: 模版驱动式表单 表单的数据模型是通过组件模版中的相关指令来定义的.由于使用这种方式定义表单的数据模型时,我们会受限于HTML的语法,所以,模版驱动方式只适用于 ...

  5. 【.net+jquery】绘制自定义表单(含源码)

    前言 两年前在力控的时候就想做一个类似的功能,当时思路大家都讨论好了,诸多原因最终还是夭折了.没想到两年多后再这有重新提出要写一个绘制表单的功能.对此也是有点小激动呢?总共用时8.5天的时间基本功能也 ...

  6. Orchard创建自定义表单

    本文链接:http://www.cnblogs.com/souther/p/4520130.html 主目录 自定义表单模块可以用来获取网站前台用户的信息.自定义表单需要与一个内容类型结合使用.它可以 ...

  7. Angular19 自定义表单控件

    1 需求 当开发者需要一个特定的表单控件时就需要自己开发一个和默认提供的表单控件用法相似的控件来作为表单控件:自定义的表单控件必须考虑模型和视图之间的数据怎么进行交互 2 官方文档 -> 点击前 ...

  8. Winform自定义表单(转)

    出处:http://www.newlifex.com/showtopic-167.aspx 好吧,附件真的损坏了,原始代码我也没有了,再提取我也没精力了,不好意思,哪位之前下过可以重发一遍吗?不过即使 ...

  9. ZKEACMS 自定义表单的使用

    ZKEACMS Core 2.2 已经发布了,其中主要添加了自定义表单的功能.使用自定义表单的功能,您可以在几分钟内就创建一个表单,并用它来收集一些信息.导出收集的信息,就可以做一些统计分析. 创建表 ...

随机推荐

  1. thinkphp 快捷查询

    快捷查询方式是一种多字段查询的简化写法,可以进一步简化查询条件的写法,在多个字段之间用|分割表示OR查询,用&分割表示AND查询,可以实现下面的查询,例如: 大理石平台价格 一.不同字段相同的 ...

  2. Django之深入了解模板层

    目录 模板语法 模板传值 过滤器 标签 自定义过滤器和标签 模板继承 模板导入 模板语法 前端模板的语法只记住两种就行了. {{ xxx }} 变量相关的 { % % } 逻辑相关的 模板传值 我们通 ...

  3. LUOGU P4281 [AHOI2008]紧急集合 / 聚会 (lca)

    传送门 解题思路 可以通过手玩或打表发现,其实要选的点一定是他们三个两两配对后其中一对的$lca$上,那么就直接算出来所有的$lca$,比较大小就行了. #include<iostream> ...

  4. pyQT Dialog默认选中某一个选项问题的解决

    方法一: 在新建ui文件时不要新建Dialog # -*- coding: utf-8 -*- # Form implementation generated from reading ui file ...

  5. Java-Druid:Druid

    ylbtech-Java-Druid:Druid Apache Druid(孵化)是一个高性能的实时分析数据库. 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部 ...

  6. PAT甲级——A1086 Tree Traversals Again

    An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example ...

  7. PAT甲级——A1081 Rational Sum

    Given N rational numbers in the form numerator/denominator, you are supposed to calculate their sum. ...

  8. RocketMQ补偿方案架构设计

    RocketMQ作为消息中间件,在系统异步化架构中,应用非常广泛.但是我们在享用RocketMQ的同时,也不能百分百完全信赖它.一旦RocketMQ崩溃了,给我们业务带来的也将是毁灭性打击. 因此,我 ...

  9. windows API 第 18篇 FindFirstVolume FindNextVolume

    函数定义:Retrieves the name of a volume on a computer. FindFirstVolume is used to begin scanning the vol ...

  10. UDP和TCP的区别?

    区别总结: 1.TCP面向连接,UDP的面向无连接的,即发送数据之前不需要建立简介. 2.TCP提供可靠的数据传输,有发送应答机制,超时重传机制,错误校验机制,流量控制机制保证传输的安全,不丢失,不重 ...