html radio 选中_使用Angular7开发一个Radio组件

一、准备工作

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、生成结构如图所示 接下来开始写组件

d76b8d664fc2d9f0dc2bc22f91350425.png


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中是这样定义和使用的

41ee825b24e5401d1281a9ba2d341bce.png

57f3cbae8403ce3d014e941449229451.png

他们分别是在formcontrol的updateOn(这个属性可以自定义)属性值为change或者blur的时候调用。因此,我们在重写这两个方法的时候应该注意,是重写一个还是都要重写。本组件两个方法都重写了,因为值变更的时机自定义成了blur。

三、这就是我的关于radio组件的封装开发,还请各位大牛朋友们多多指点,后续会继续推出关于Angular的开发以及研究。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值