利用Angular7开发一个Radio组件的全过程


Posted in Javascript onJuly 11, 2019

一、准备工作

Angular7(以下简称ng7),已经跟之前版本大有不同。新建工程后,可方便创建library(简称lib),lib是什么呢?就是一个npm包的源码包。npm作为强大的包管理器,已经成为很多FEer分享智慧成果的法器。本文主要介绍本人写的一个radio组件。

二、开发组件radio过程

1、使用ng cli,新建工程,创建lib

// 安装ng cli
npm install -g @angular/cli
// 新建工程
ng new ng-project
// 进入ng-project 创建一个lib
ng generate library radio

2、生成结构如图所示 接下来开始写组件

利用Angular7开发一个Radio组件的全过程

3、radio结构如下

<!--说明:这其实是一个radio-group 因为radio一般都是分组使用,这里有几个注意点

1、组内radio的name属性保持一致、组外保持唯一

2、通过checked属性来设置radio的选中状态,一定不要写成[attr.checked]-->

<div class="input-wrap" [class.hor]="horizontal">
  <div class="custom-radio" *ngFor="let item of data; let i=index">
    <input #input class="custom-input" [name]="name" id="{{'radio_'+name+i}}" type="radio"
    [value]="item.value" (click)="clickHandler(item.value)" [checked]="item.value === value" 
    [disabled]="disabled">
    <label class="custom-label" for="{{'radio_'+name+i}}">{{item.name}}</label>
  </div>
</div>

4、radio组件主体代码如下

export class RadioGroupComponent implements ControlValueAccessor {

  /* radio 数组 */
  @Input()
  data: Radio[] = [];

  /* radio 类型  原生或者按钮类型*/
  @Input()
  type: string;

  /* name标识 */
  @Input()
  name: string = this.idSer.generate().replace(/-/g, '_');

  /* 水平排列 */
  @Input()
  horizontal: boolean;

  /* 禁用 */
  @Input()
  disabled: boolean;

  /* radio 值 */
  @Input() value: any;

  constructor(private idSer: IdService) {

  }

  clickHandler(val: any) {
    this.value = val;
    // 更改control的值
    this.controlChange(this.value);
    this.controlTouch(this.value);
  }


  writeValue(value: any): void {
    this.value = value;
  }

  registerOnChange(fn: Function): void {
    this.controlChange = fn
  }

  registerOnTouched(fn: Function): void {
    this.controlTouch = fn
  }

  private controlChange: Function = () => { }
  private controlTouch: Function = () => { }

}

说明:其实组件代码不是很多,但是应该注意到,我们继承了ng的一个interface ControlValueAccessor,这里我觉的是比较值得侃的地方。这是ng的一个forms API,可以方便原生DOM和ng forms传值。在组件元数据中这样定义

@Component({
  selector: 'radiogroup',
  templateUrl: './radiogroup.component.html',
  providers: [{
    provide: NG_VALUE_ACCESSOR,
    useExisting: forwardRef(() => RadioGroupComponent),
    multi: true,
  }]
})

其中,这里面有两个重要的方法需要overwrite,不错,就是registerOnChange和registerOnTouched,这两个方法在angular中是这样定义和使用的

利用Angular7开发一个Radio组件的全过程

他们分别是在formcontrol的updateOn(这个属性可以自定义)属性值为change或者blur的时候调用。因此,我们在重写这两个方法的时候应该注意,是重写一个还是都要重写。本组件两个方法都重写了,因为值变更的时机自定义成了blur。

三、这就是我的关于radio组件的封装开发,还请各位大牛朋友们多多指点,后续会继续推出关于Angular的开发以及研究。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Extjs学习笔记之三 extjs form更多的表单项
Jan 07 Javascript
为JavaScript提供睡眠功能(sleep) 自编译JS引擎
Aug 16 Javascript
jQuery标签替换函数replaceWith()的使用例子
Aug 28 Javascript
js实现简单排列组合的方法
Jan 27 Javascript
jQuery on()绑定动态元素出现的问题小结
Feb 19 Javascript
基于javascript实现九九乘法表
Mar 27 Javascript
浅析JavaScript中的array数组类型系统
Jul 18 Javascript
jQuery实现的网页换肤效果示例
Sep 20 Javascript
js滚轮事件兼容性问题需要注意哪些
Nov 15 Javascript
JS实现json的序列化和反序列化功能示例
Jun 13 Javascript
使用3D引擎threeJS实现星空粒子移动效果
Sep 13 Javascript
使用js和canvas实现时钟效果
Sep 08 Javascript
vue发送websocket请求和http post请求的实例代码
Jul 11 #Javascript
微信小程序之几种常见的弹框提示信息实现详解
Jul 11 #Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
Jul 11 #jQuery
vue项目中实现缓存的最佳方案详解
Jul 11 #Javascript
浅入深出Vue之组件使用
Jul 11 #Javascript
elementUI 动态生成几行几列的方法示例
Jul 11 #Javascript
JS为什么说async/await是generator的语法糖详解
Jul 11 #Javascript
You might like
PHP 事件机制(2)
2011/03/23 PHP
php下载excel无法打开的解决方法
2013/12/24 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
2015/11/19 PHP
PHP Static延迟静态绑定用法分析
2016/03/16 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
Laravel5.5 视图 - 创建视图和数据传递示例
2019/10/21 PHP
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
HTML页面登录时的JS验证方法
2014/05/28 Javascript
js基于cookie记录来宾姓名的方法
2016/07/19 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
vue省市区三联动下拉选择组件的实现
2017/04/28 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
TypeScript的安装、使用、自动编译的实现
2020/04/10 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
基于ID3决策树算法的实现(Python版)
2017/05/31 Python
JavaScript中的模拟事件和自定义事件实例分析
2018/07/27 Python
用python写测试数据文件过程解析
2019/09/25 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
深入了解python列表(LIST)
2020/06/08 Python
python 生成器需注意的小问题
2020/09/29 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
初中生三年学习生活的自我评价
2013/11/03 职场文书
做一个有道德的人演讲稿
2014/05/14 职场文书
人代会标语
2014/06/30 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
浅谈GO中的Channel以及死锁的造成
2022/03/18 Golang
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers