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

单值组件:input/select/radio/textarea

多值组件:checkbox/tree组件

条件:

1.必须实现ControlValueAccessor接口

不同输入控件的数据更新方式不一样。

比如input是设置value值,而checkbox是设置checked属性。

因此不同类型的输入控件都有一个ControlValueAccessor来更新视图

  1. export interface ControlValueAccessor{
  2. writeVlaue(obj:any) :void; //model->view
  3. registerOnchange(fn:any) :void; //view->model
  4. registerOnTouched(fn:any):void;
  5. setDisabledState?( isDisabled:boolean):void
  6. }
  1. //实现
  2.  
  3. writeValue(value:any){
  4. if(value!=this.innerVal){
  5. this.innerVal=value;
  6. }
  7. }

2.必须注册成为表单组件(使用providers属性)

注释:

1.provide:将组件注册到DI框架,让其成为一个可被表单访问的组件

2.useExisting:让组件暴露对应的validatate方法实现表单验证

3.multi:为true时表示这个token对应多个依赖项,可在多个表单里使用,互不影响

  1. @Component({
  2. selector:'nw-input',
  3. templateUrl:'./nw-input.component.html',
  4. styleUrls:'./nw-input.component.scss',
  5. providers:[
  6. provide:NG_VALUE_ACCESSOR,
  7. useExisting:forwardRef(()=>nwInputComponent),
  8. multi:true
  9. ]
  10. })

具体实现:

1.如果是单值表单组件,使用FormControl

  1. //nw-select.component.ts
  2.  
  3. @Component({
  4. selector:'nw-select',
  5. templateUrl:'./nw-select.component.html',
  6. styleUrls:'./nw-select.component.scss',
  7. providers:[
  8. provide:NG_VALUE_ACCESSOR,
  9. useExisting:forwardRef(()=>NwSelectComponent),
  10. multi:true
  11. ]
  12. })
  13.  
  14. export class NwSelectComponent implements ControlValueAccessor{
  15. selectFormControl:FormControl=new FormControl();
  16.  
  17. getControl(vfn:ValidatorFn[]):FormControl{
  18. if(!this.selectFormControl){
  19. this.selectFormControl=new FormControl('',vfn)
  20. }
  21. return this.selectFormControl
  22. }
  23. }
  1. //xx.component.ts
  2.  
  3. export class xxComponent implements OnInit {
  4. thatForm:formGroup;
  5. @ViewChild('xxComp')
  6. xxComp:NwSelectComponent;
  7.  
  8. ngOnInit(){
  9. xx:this.xxComp.getControl([Validator.required,Validators.minLength(5)]) //验证条件还是数组
  10. }
  11. }

2.如果是多值表单组件,使用FormArray

  1. //nw-checkbox.component.ts
  2.  
  3. @Component({
  4. selector:'nw-checkbox',
  5. templateUrl:'./nw-checkbox.component.html',
  6. styleUrls:'./nw-checkbox.component.scss',
  7. providers:[
  8. provide:NG_VALUE_ACCESSOR,
  9. useExisting:forwardRef(()=>NwCheckboxGroupComponent),
  10. multi:true
  11. ]
  12. })
  13.  
  14. export class NwCheckboxGroupComponent implements ControlValueAccessor{
  15. checkboxFormArray:FormArray=new FormArray([]);
  16.  
  17. getControls(vfn:ValidatorFn):FormArray{
  18. if(!this.checkboxkFormArray){
  19. this.checkboxFormArray=new FormArray([],vfn);
  20. }
  21. }
  22. cleanControls(){
  23. while(this.checkboxFormArray.controls.length!==0){
  24. this.checkboxFormArray.removeAt(0)
  25. }
  26. pushControl(id:any){
  27. this.checkboxFormArray.push(new FormControl(id))
  28. }
  29. }
  30. }
  1. //xx.component.ts
  2.  
  3. export class xxComponent implements OnInit {
  4. thatForm:FormGroup;
  5. @ViewChild(xxComp)
  6. xxComp:NwCheckboxGroupComponent;
  7.  
  8. ngOnInit(){
  9. this.thatFom=this.formBuilder.group({
  10. xx:this.xxComp.getControls(Valitators.required) //验证条件不再允许数组了
  11. })
  12. }
  13. }

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. sectionStorage与localStorage更新缓存,以及更新layui的数据缓存

    var aa = sessionStorage.getItem('datInfo');//获取缓存数据 name = aa.user; var names = '张三'; sessionStorage ...

  2. [转]Hessian——轻量级远程调用方案

    Hessian是caucho公司开发的一种基于二进制RPC协议(Remote Procedure Call protocol)的轻量级远程调用框架.具有多种语言的实现,但用的最多的当然是Java实现 ...

  3. thinkPHP 字段映射功能

    thinkPHP的字段映射功能可以让你在表单中隐藏真正的数据表字段,而不用担心放弃自动创建表单对象的功能,假设我们的User表里面有username和email字段,我们需要映射成另外的字段,定义方式 ...

  4. &卡特兰数学习笔记

    一.关于卡特兰数 卡特兰数是一种经典的组合数,经常出现在各种计算中,其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 20801 ...

  5. 莫烦pytorch学习笔记(七)——Optimizer优化器

    各种优化器的比较 莫烦的对各种优化通俗理解的视频 import torch import torch.utils.data as Data import torch.nn.functional as ...

  6. iOS之CATextLayer属性简介

    1.CATextLayer简介 CATextLayer快速高效简单地来渲染纯文本.NSAttributedString /* The text layer provides simple text l ...

  7. OpenCASCADE 7.4.0 Released

    Open Cascade is pleased to announce a new public release of Open CASCADE Technology (version 7.4.0). ...

  8. 操作系统-CPU调度

    概念 控制.协调多个进程对CPU的竞争 即按一定的调度算法从就绪队列中选择一个进程,把CPU的使用权交给被选中的进程 场景 N个进程就绪,等待上M(M>=1)个CPU运行,需要决策哪个进程分配给 ...

  9. Mybatis-configuration 配置-settings配置

    设置参数 描述 有效值 默认值 cacheEnabled 这个配置使全局的映射器启用或禁用 缓存. true | false true lazyLoadingEnabled 全局启用或禁用延迟加载.当 ...

  10. Python学习day43-数据库(多表关系)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...