利用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实战之品牌展示列表效果
Apr 10 Javascript
通过JavaScript控制字体大小的代码
Oct 04 Javascript
js 判断js函数、变量是否存在的简单示例代码
Mar 04 Javascript
angularJS 入门基础
Feb 09 Javascript
JS设置下拉列表框当前所选值的方法
Dec 22 Javascript
深入理解jQuery()方法的构建原理
Dec 05 Javascript
详解Vue中状态管理Vuex
May 11 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
May 24 jQuery
Vue+Element UI+vue-quill-editor富文本编辑器及插入图片自定义
Aug 20 Javascript
VUE页面中通过双击实现复制表格中内容的示例代码
Jun 11 Javascript
vue实现标签云效果的示例
Nov 09 Javascript
vue 中使用print.js导出pdf操作
Nov 13 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实现递归的三种基本方式
2020/07/04 PHP
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
jquery图片切换插件
2015/03/16 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
javascript中一些util方法汇总
2015/06/10 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
JQuery fileupload插件实现文件上传功能
2016/03/18 Javascript
javascript拖拽应用实例
2016/03/25 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
js仿手机页面文件下拉刷新效果
2016/10/14 Javascript
浅谈jQuery操作类数组的工具方法
2016/12/23 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
前后端如何实现登录token拦截校验详解
2018/09/03 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
详解Vue 单文件组件的三种写法
2020/02/19 Javascript
webpack.DefinePlugin与cross-env区别详解
2020/02/23 Javascript
Javascript异步执行不按顺序解决方案
2020/04/30 Javascript
python 实时遍历日志文件
2016/04/12 Python
使用Python的Twisted框架构建非阻塞下载程序的实例教程
2016/05/25 Python
对Python3 解析html的几种操作方式小结
2019/02/16 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
用Python写一个自动木马程序
2019/09/17 Python
python dict乱码如何解决
2020/06/07 Python
用Python爬取LOL所有的英雄信息以及英雄皮肤的示例代码
2020/07/13 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
html5 更新图片颜色示例代码
2014/07/29 HTML / CSS
C#中的验证控件有几种
2014/03/08 面试题
大专计算机个人求职的自我评价
2013/10/21 职场文书
临床医师专业个人自我评价范文
2013/11/07 职场文书
求职信格式范本
2013/11/15 职场文书
英语专业学生的自我评价
2013/12/30 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js