利用Angular7開發(fā)一個(gè)Radio組件的全過程
一、準(zhǔn)備工作
Angular7(以下簡稱ng7),已經(jīng)跟之前版本大有不同。新建工程后,可方便創(chuàng)建library(簡稱lib),lib是什么呢?就是一個(gè)npm包的源碼包。npm作為強(qiáng)大的包管理器,已經(jīng)成為很多FEer分享智慧成果的法器。本文主要介紹本人寫的一個(gè)radio組件。
二、開發(fā)組件radio過程
1、使用ng cli,新建工程,創(chuàng)建lib
// 安裝ng cli npm install -g @angular/cli // 新建工程 ng new ng-project // 進(jìn)入ng-project 創(chuàng)建一個(gè)lib ng generate library radio
2、生成結(jié)構(gòu)如圖所示 接下來開始寫組件
3、radio結(jié)構(gòu)如下
<!--說明:這其實(shí)是一個(gè)radio-group 因?yàn)閞adio一般都是分組使用,這里有幾個(gè)注意點(diǎn)
1、組內(nèi)radio的name屬性保持一致、組外保持唯一
2、通過checked屬性來設(shè)置radio的選中狀態(tài),一定不要寫成[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 數(shù)組 */ @Input() data: Radio[] = []; /* radio 類型 原生或者按鈕類型*/ @Input() type: string; /* name標(biāo)識(shí) */ @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 = () => { } }
說明:其實(shí)組件代碼不是很多,但是應(yīng)該注意到,我們繼承了ng的一個(gè)interface ControlValueAccessor,這里我覺的是比較值得侃的地方。這是ng的一個(gè)forms API,可以方便原生DOM和ng forms傳值。在組件元數(shù)據(jù)中這樣定義
@Component({ selector: 'radiogroup', templateUrl: './radiogroup.component.html', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupComponent), multi: true, }] })
其中,這里面有兩個(gè)重要的方法需要overwrite,不錯(cuò),就是registerOnChange和registerOnTouched,這兩個(gè)方法在angular中是這樣定義和使用的
他們分別是在formcontrol的updateOn(這個(gè)屬性可以自定義)屬性值為change或者blur的時(shí)候調(diào)用。因此,我們?cè)谥貙戇@兩個(gè)方法的時(shí)候應(yīng)該注意,是重寫一個(gè)還是都要重寫。本組件兩個(gè)方法都重寫了,因?yàn)橹底兏臅r(shí)機(jī)自定義成了blur。
三、這就是我的關(guān)于radio組件的封裝開發(fā),還請(qǐng)各位大牛朋友們多多指點(diǎn),后續(xù)會(huì)繼續(xù)推出關(guān)于Angular的開發(fā)以及研究。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Angular 2 利用Router事件和Title實(shí)現(xiàn)動(dòng)態(tài)頁面標(biāo)題的方法
本篇文章主要介紹了Angular 2 利用Router事件和Title實(shí)現(xiàn)動(dòng)態(tài)頁面標(biāo)題的方法,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08Angularjs實(shí)現(xiàn)控制器之間通信方式實(shí)例總結(jié)
這篇文章主要介紹了Angularjs實(shí)現(xiàn)控制器之間通信方式,結(jié)合實(shí)例形式總結(jié)分析了AngularJS控制器常用通信方式及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-03-03詳解Webstorm 下的Angular2.0開發(fā)之路(圖文)
這篇文章主要介紹了詳解Webstorm 下的Angular2.0開發(fā)之路(圖文) ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12Angular4學(xué)習(xí)筆記之根模塊與Ng模塊
這篇文章主要介紹了Angular4學(xué)習(xí)筆記之根模塊與Ng模塊,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09AngularJS標(biāo)簽頁tab選項(xiàng)卡切換功能經(jīng)典實(shí)例詳解
這篇文章主要介紹了AngularJS實(shí)現(xiàn)標(biāo)簽頁tab選項(xiàng)卡功能,結(jié)合實(shí)例形式總結(jié)分析了各種常用的tab選項(xiàng)卡切換操作實(shí)現(xiàn)技巧與相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-05-05AngularJS中的$parse服務(wù)與$eval服務(wù)用法實(shí)例
這篇文章主要介紹了AngularJS中的$parse服務(wù)與$eval服務(wù)用法,結(jié)合實(shí)例形式分析了AngularJS中$parse服務(wù)與$eval服務(wù)的功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2023-05-05AngularJS入門知識(shí)之MVW類框架的編程思想探討
這篇文章主要介紹了AngularJS入門知識(shí)之MVW類框架的編程思想探討,本文通過實(shí)現(xiàn)兩個(gè)簡單的業(yè)務(wù)需求,探討AngularJS和傳統(tǒng)的JavaScript控制DOM實(shí)現(xiàn)方式的差別,并嘗試?yán)斫?MVW此類框架在流行的Web前端開發(fā)中的編程思想,需要的朋友可以參考下2014-12-12