利用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获取点击控件的绝对位置简单实例
Oct 13 Javascript
jQuery编写textarea输入字数限制代码
Mar 23 jQuery
使用Bootstrap打造特色进度条效果
May 02 Javascript
JavaScript通过filereader接口读取文件
May 10 Javascript
Node.js使用MySQL连接池的方法实例
Feb 11 Javascript
JavaScript字符串转数字的5种方法及遇到的坑
Jul 16 Javascript
在微信小程序里使用watch和computed的方法
Aug 02 Javascript
vscode配置vue下的es6规范自动格式化详解
Mar 20 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
Apr 14 Javascript
JS图片预加载三种实现方法解析
May 08 Javascript
element 动态合并表格的步骤
Dec 31 Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 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
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
背景图跟随鼠标移动的Mootools插件实现代码
2011/12/12 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
Extjs中TabPane如何嵌套在其他网页中实现思路及代码
2013/01/27 Javascript
判断JS对象是否拥有某种属性的两种方式
2013/12/02 Javascript
JS清除选择内容的方法
2015/01/29 Javascript
jQuery页面元素动态添加后绑定事件丢失方法,非 live
2016/06/16 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
利用jQuery对无序列表排序的简单方法
2016/10/16 Javascript
详解A标签中href=&quot;&quot;的几种用法
2017/08/20 Javascript
jQuery实现获取form表单内容及绑定数据到form表单操作分析
2018/07/03 jQuery
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
antdesign-vue结合sortablejs实现两个table相互拖拽排序功能
2021/01/08 Vue.js
[45:40]Ti4 冒泡赛第二天NEWBEE vs NaVi 1
2014/07/15 DOTA
python3实现域名查询和whois查询功能
2018/06/21 Python
Python爬取qq空间说说的实例代码
2018/08/17 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
Python解析json时提示“string indices must be integers”问题解决方法
2019/07/31 Python
Python流程控制 while循环实现解析
2019/09/02 Python
python调用Matplotlib绘制分布点图
2019/10/18 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
掌上明珠Java程序员面试总结
2016/02/23 面试题
小学家长会邀请函
2014/01/23 职场文书
司马光教学反思
2014/02/01 职场文书
cf战队收人口号
2014/06/21 职场文书
2016年村干部公开承诺书(公开承诺事项)
2016/03/25 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
Python  序列化反序列化和异常处理的问题小结
2022/12/24 Python