利用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单独定义各组件的实例代码
Jun 25 Javascript
jQuery中:has选择器用法实例
Dec 30 Javascript
jquery实现上下左右滑动的方法
Feb 09 Javascript
Angularjs 滚动加载更多数据
Mar 17 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
Aug 31 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
Oct 31 Javascript
JS中substring与substr的用法
Nov 16 Javascript
详解vue-router基本使用
Apr 18 Javascript
JavaScript的继承实现小结
May 07 Javascript
React Native时间转换格式工具类分享
Oct 24 Javascript
react antd实现动态增减表单
Jun 03 Javascript
vue使用wavesurfer.js解决音频可视化播放问题
Apr 04 Vue.js
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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
谈谈新手如何学习PHP 默默经典版本
2009/08/04 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
php统计文章排行示例
2014/03/04 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
php使用正则验证中文
2016/04/06 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
PHP微信分享开发详解
2017/01/14 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
在一个浏览器里呈现所有浏览器测试结果的前端测试工具的思路
2010/03/02 Javascript
javascript与CSS复习(二)
2010/06/29 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
js实现仿Discuz文本框弹出层效果
2015/08/13 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
Webwork 实现文件上传下载代码详解
2016/02/02 Javascript
AngularJS 前台分页实现的示例代码
2018/06/07 Javascript
详解vue axios用post提交的数据格式
2018/08/07 Javascript
详解关于Vue2.0路由开启keep-alive时需要注意的地方
2018/09/18 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
多页vue应用的单页面打包方法(内含打包模式的应用)
2020/06/11 Javascript
python实现定时同步本机与北京时间的方法
2015/03/24 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
利用python修改json文件的value方法
2018/12/31 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
浅谈Python 函数式编程
2020/06/20 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
Roxy荷兰官方网站:冲浪、滑雪板、服装和配件
2019/10/22 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
教师远程培训感言
2014/03/06 职场文书
南京市纪委监察局整改方案
2014/09/16 职场文书
年会主持人开场白台词
2015/05/29 职场文书