欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

利用Angular7开发一个Radio组件的全过程

程序员文章站 2022-03-07 09:36:55
一、准备工作 angular7(以下简称ng7),已经跟之前版本大有不同。新建工程后,可方便创建library(简称lib),lib是什么呢?就是一个npm包的源码包...

一、准备工作

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的开发以及研究。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。