利用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 相关文章推荐
js CSS操作方法集合
Oct 31 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
Dec 28 Javascript
开发 Internet Explorer 右键功能表(ContextMenu)
Jul 03 Javascript
判断输入是否为空,获得输入类型的JS代码
Oct 30 Javascript
js控制分页打印、打印分页示例
Feb 08 Javascript
根据当前时间在jsp页面上显示上午或下午
Aug 18 Javascript
JavaScript+html5 canvas制作的圆中圆效果实例
Jan 27 Javascript
Android中Okhttp3实现上传多张图片同时传递参数
Feb 18 Javascript
使用webpack搭建vue项目及注意事项
Jun 10 Javascript
vue-cli3访问public文件夹静态资源报错的解决方式
Sep 02 Javascript
TypeScript 运行时类型检查补充工具
Sep 28 Javascript
基于javascript实现放大镜特效
Dec 03 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
一个很方便的 XML 类!!原创的噢
2006/10/09 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
Thinkphp中import的几个用法详细介绍
2014/07/02 PHP
分享最受欢迎的5款PHP框架
2014/11/27 PHP
PHP滚动日志的代码实现
2015/06/10 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
2016/05/17 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
2013/06/04 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
如何获取网站icon有哪些可行的方法
2014/06/05 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
微信小程序promsie.all和promise顺序执行
2017/10/27 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
微信小程序自定义select下拉选项框组件的实现代码
2018/08/28 Javascript
mpvue+vuex搭建小程序详细教程(完整步骤)
2018/09/30 Javascript
ES6知识点整理之函数对象参数默认值及其解构应用示例
2019/04/17 Javascript
js计算最大公约数和最小公倍数代码实例
2019/09/11 Javascript
[02:02]DOTA2英雄基础教程 斯拉达
2013/12/11 DOTA
python标准日志模块logging的使用方法
2013/11/01 Python
学习python中matplotlib绘图设置坐标轴刻度、文本
2018/02/07 Python
python制作简单五子棋游戏
2019/06/18 Python
Python3 文章标题关键字提取的例子
2019/08/26 Python
详解mac python+selenium+Chrome 简单案例
2019/11/08 Python
python 实现保存最新的三份文件,其余的都删掉
2019/12/22 Python
适合Python初学者的一些编程技巧
2020/02/12 Python
HTMl5的存储方式sessionStorage和localStorage详解
2014/03/18 HTML / CSS
如何开启linux的ssh服务
2015/02/14 面试题
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
教师自我反思材料
2014/02/14 职场文书
《诚实与信任》教学反思
2014/04/10 职场文书
小学教师评语大全
2014/04/23 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
人事任命书范本
2015/09/21 职场文书
HDFS免重启挂载新磁盘
2022/04/06 Servers