利用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 相关文章推荐
Jquery操作radio的简单实例
Jan 06 Javascript
Js与下拉列表处理问题解决
Feb 13 Javascript
巧用局部变量提升javascript性能
Feb 24 Javascript
JavaScript通过字典进行字符串翻译转换的方法
Mar 19 Javascript
javascript字符串函数汇总
Dec 06 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
Feb 17 Javascript
基于MVC方式实现三级联动(JavaScript)
Jan 23 Javascript
vue双向绑定简要分析
Mar 23 Javascript
Vue组件之Tooltip的示例代码
Oct 18 Javascript
Node.js Event Loop各阶段讲解
Mar 08 Javascript
Javascript var变量删除原理及实现
Aug 26 Javascript
避坑之 JavaScript 中的toFixed()和正则表达式
Apr 19 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的Yii框架中View视图的使用进阶
2016/03/29 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
向fckeditor编辑器插入指定代码的方法
2007/05/25 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
围观tangram js库
2010/12/28 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
2015/08/24 Javascript
JavaScript动态设置div的样式的方法
2015/12/26 Javascript
jQuery通过ajax请求php遍历json数组到table中的代码(推荐)
2016/06/12 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
js实现随机点名系统(实例讲解)
2017/10/18 Javascript
jQuery+SpringMVC中的复选框选择与传值实例
2018/01/08 jQuery
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
angular.js实现列表orderby排序的方法
2018/10/02 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
微信小程序商品详情页底部弹出框
2019/11/22 Javascript
Python的print用法示例
2014/02/11 Python
python学习笔记:字典的使用示例详解
2014/06/13 Python
使用Python多线程爬虫爬取电影天堂资源
2016/09/23 Python
深入了解Django中间件及其方法
2019/07/26 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
python中count函数简单的实例讲解
2020/02/06 Python
python更新数据库中某个字段的数据(方法详解)
2020/11/18 Python
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
夜大自我鉴定
2013/10/31 职场文书
十一酒店活动方案
2014/02/20 职场文书
支部书记四风对照材料
2014/08/28 职场文书
四风问题对照检查材料整改措施
2014/09/27 职场文书
企业年检委托书范本
2014/10/14 职场文书
教育实习指导教师评语
2014/12/31 职场文书
投标邀请书范本
2015/02/02 职场文书
社区元宵节活动总结
2015/02/06 职场文书
行为规范主题班会
2015/08/13 职场文书
离婚协议书范本(2016最新版)
2016/03/18 职场文书
基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
2022/02/12 Redis