利用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 相关文章推荐
Web开发者必备的12款超赞jQuery插件
Dec 03 Javascript
textarea中的手动换行处理的jquery代码
Feb 26 Javascript
JavaScript代码实现禁止右键、禁选择、禁粘贴、禁shift、禁ctrl、禁alt
Nov 17 Javascript
纯js实现手风琴效果
Apr 17 Javascript
JavaScript事件学习小结(一)事件流
Jun 09 Javascript
javascript类型系统_正则表达式RegExp类型详解
Jun 24 Javascript
微信小程序  简单实例(阅读器)的实例开发
Sep 29 Javascript
angular-cli修改端口号【angular2】
Apr 19 Javascript
利用ECharts.js画K线图的方法示例
Jan 10 Javascript
JavaScript常见鼠标事件与用法分析
Jan 03 Javascript
websocket4.0+typescript 实现热更新的方法
Aug 14 Javascript
原生js实现二级联动菜单
Nov 27 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
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
thinkphp中memcache的用法实例
2014/11/29 PHP
Laravel 5框架学习之表单
2015/04/08 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
使用php+swoole对client数据实时更新(一)
2016/01/07 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&amp;Firefox] 有文档和例子
2007/05/30 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
原生JS实现图片轮播效果
2016/12/26 Javascript
Three.js的使用及绘制基础3D图形详解
2017/04/27 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
vue+element 模态框表格形式的可编辑表单实现
2019/06/07 Javascript
详解在vue-cli3.0中自定css、js和图片的打包路径
2019/08/26 Javascript
Vue3.0数据响应式原理详解
2019/10/09 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
[01:09]模型精美,特效酷炫!TI9不朽宝藏Ⅰ鉴赏
2019/05/10 DOTA
python使用wxpython开发简单记事本的方法
2015/05/20 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
python实现人性化显示金额数字实例详解
2020/09/25 Python
CSS3绘制圆角矩形的简单示例
2015/09/28 HTML / CSS
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
大学生党员自我剖析材料
2014/10/06 职场文书
致800米运动员广播稿(10篇)
2014/10/17 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
2015年重阳节活动总结
2015/03/24 职场文书
民间借贷被告代理词
2015/05/23 职场文书
2015领导干部廉洁自律工作总结
2015/07/23 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python
Pytorch中Softmax和LogSoftmax的使用详解
2021/06/05 Python