利用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 相关文章推荐
IE浏览器打印的页眉页脚设置解决方法
Dec 08 Javascript
利用jQuery 实现GridView异步排序、分页的代码
Feb 06 Javascript
jQuery 选择器、DOM操作、事件、动画
Nov 25 Javascript
15款优秀的jQuery导航菜单插件分享
Jul 19 Javascript
JavaScript中使用arguments获得函数传参个数实例
Aug 27 Javascript
Bootstrap下拉菜单效果实例代码分享
Jun 30 Javascript
javascript学习笔记_浅谈基础语法,类型,变量
Sep 19 Javascript
Bootstrap源码解读模态弹出框(11)
Dec 28 Javascript
详解用Node.js写一个简单的命令行工具
Mar 01 Javascript
对angular2中的ngfor和ngif指令嵌套实例讲解
Sep 12 Javascript
vue与bootstrap实现简单用户信息添加删除功能
Feb 15 Javascript
vue如何在项目中调用腾讯云的滑动验证码
Jul 15 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下的浮点运算不准的解决方法
2016/10/27 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
2018/05/23 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
JavaScript 对象、函数和继承
2009/07/07 Javascript
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
JavaScript 学习笔记之操作符(续)
2015/01/14 Javascript
jQuery实现带水平滑杆的焦点图动画插件
2016/03/08 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
微信公众平台 客服接口发消息的实现代码(Java接口开发)
2019/04/17 Javascript
纯js实现无缝滚动功能代码实例
2020/02/21 Javascript
[46:23]完美世界DOTA2联赛PWL S2 FTD vs Magma 第一场 11.20
2020/11/23 DOTA
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
python判断自身是否正在运行的方法
2019/08/08 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
英国现代绅士品牌:Hackett
2017/12/17 全球购物
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
Europcar美国/加拿大:预订汽车或卡车租赁服务
2018/11/13 全球购物
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
Nanushka官网:匈牙利服装品牌
2019/08/14 全球购物
说出数据连接池的工作机制是什么?
2013/04/19 面试题
《姥姥的剪纸》教学反思
2014/02/25 职场文书
中秋手机店促销方案
2014/06/16 职场文书
2014年评职称工作总结
2014/11/20 职场文书
2014年科技工作总结
2014/11/26 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
停电调休通知
2015/04/16 职场文书
2015年社区党建工作汇报材料
2015/06/25 职场文书
2015年学校综合治理工作总结
2015/07/20 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
Python基础之hashlib模块详解
2021/05/06 Python
python异常中else的实例用法
2021/06/15 Python
Java spring定时任务详解
2021/10/05 Java/Android
在 HTML 页面中使用 React的场景分析
2022/01/18 Javascript