利用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 相关文章推荐
使用Firebug对js进行断点调试的图文方法
Apr 02 Javascript
js控制CSS样式属性语法对照表
Dec 11 Javascript
jquery获取及设置outerhtml的方法
Mar 09 Javascript
javascript包装对象实例分析
Mar 27 Javascript
JS获取图片高度宽度的方法分享
Apr 17 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
Jul 14 Javascript
很棒的js Tab选项卡切换效果
Aug 30 Javascript
localStorage实现便签小程序
Nov 28 Javascript
基于JS脚本语言的基础语法详解
Jul 22 Javascript
100行代码实现一个vue分页组功能
Nov 06 Javascript
小程序跨页面交互的作用与方法详解
Jan 07 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
Oct 28 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
QQ登录 PHP OAuth示例代码
2011/07/20 PHP
PHP过滤★等特殊符号的正则
2014/01/27 PHP
深入浅出php socket编程
2015/05/13 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
windows系统php环境安装swoole具体步骤
2021/03/04 PHP
JavaScript中String和StringBuffer的速度之争
2010/04/01 Javascript
jquery和javascript的区别(常用方法比较)
2013/07/04 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
Vue.js中轻松解决v-for执行出错的三个方案
2017/06/09 Javascript
Mobile Web开发基础之四--处理手机设备的横竖屏问题
2017/08/11 Javascript
JavaScript实现精美个性导航栏筋斗云效果
2017/10/29 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
webpack 动态批量加载文件的实现方法
2020/03/19 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
2020/04/08 Javascript
jQuery实现异步上传一个或多个文件
2020/08/17 jQuery
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
Python 私有化操作实例分析
2019/11/21 Python
Python与C/C++的相互调用案例
2021/03/04 Python
css3实现波纹特效、H5实现动态波浪效果
2018/01/31 HTML / CSS
英国户外服装品牌:Craghoppers
2019/04/25 全球购物
俄罗斯一家时尚女装商店:Charuel
2019/12/04 全球购物
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
计算机开发个人求职信范文
2013/09/26 职场文书
融资合作协议书范本
2014/10/17 职场文书
2014年减负工作总结
2014/12/10 职场文书
环卫工作个人总结
2015/03/04 职场文书
仰望星空观后感
2015/06/10 职场文书
贷款工作证明模板
2015/06/12 职场文书
汤姆叔叔的小屋读书笔记
2015/06/30 职场文书
承诺书的签字人,需不需要承担相应的责任?
2019/07/09 职场文书
Python访问Redis的详细操作
2021/06/26 Python