利用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 相关文章推荐
身份证号码前六位所代表的省,市,区, 以及地区编码下载
Apr 12 Javascript
JavaScript Memoization 让函数也有记忆功能
Oct 27 Javascript
你有必要知道的25个JavaScript面试题
Dec 29 Javascript
jQuery实现的导航动画效果(附demo源码)
Apr 01 Javascript
AngularJs学习第八篇 过滤器filter创建
Jun 08 Javascript
聊一聊Vue.js过渡效果
Sep 07 Javascript
JAVA中截取字符串substring用法详解
Apr 14 Javascript
javascript 跨域问题以及解决办法
Jul 17 Javascript
基于vue的短信验证码倒计时demo
Sep 13 Javascript
Vue自定义toast组件的实例代码
Aug 15 Javascript
原生JS使用Canvas实现拖拽式绘图功能
Jun 05 Javascript
vue中touch和click共存的解决方式
Jul 28 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一些有意思的小区别
2006/12/06 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
基于JQuery的密码强度验证代码
2010/03/01 Javascript
JavaScript和ActionScript的交互实现代码
2010/08/01 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
微信小程序组件 marquee实例详解
2017/06/23 Javascript
vue2.x 父组件监听子组件事件并传回信息的方法
2017/07/17 Javascript
利用CDN加速react webpack打包后的文件详解
2018/02/22 Javascript
浅入深出Vue之组件使用
2019/07/11 Javascript
[03:48]大碗DOTA
2019/07/25 DOTA
Python学习笔记(二)基础语法
2014/06/06 Python
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
python将pandas datarame保存为txt文件的实例
2019/02/12 Python
Python嵌套式数据结构实例浅析
2019/03/05 Python
opencv3/C++实现视频背景去除建模(BSM)
2019/12/11 Python
python实现图书馆抢座(自动预约)功能的示例代码
2020/09/29 Python
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
JAVA软件工程师测试题
2014/07/25 面试题
英语专业学生的自我评价
2013/12/30 职场文书
数控个人求职信范文
2014/02/03 职场文书
高中学生期末评语
2014/04/25 职场文书
销售口号大全
2014/06/11 职场文书
教师节倡议书
2014/08/30 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
mysql 获取相邻数据项
2022/05/11 MySQL
Python加密与解密模块hashlib与hmac
2022/06/05 Python