利用Angular7開發(fā)一個Radio組件的全過程
一、準(zhǔn)備工作
Angular7(以下簡稱ng7),已經(jīng)跟之前版本大有不同。新建工程后,可方便創(chuàng)建library(簡稱lib),lib是什么呢?就是一個npm包的源碼包。npm作為強(qiáng)大的包管理器,已經(jīng)成為很多FEer分享智慧成果的法器。本文主要介紹本人寫的一個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)建一個lib ng generate library radio
2、生成結(jié)構(gòu)如圖所示 接下來開始寫組件

3、radio結(jié)構(gòu)如下
<!--說明:這其實是一個radio-group 因為radio一般都是分組使用,這里有幾個注意點(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)識 */
@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 = () => { }
}
說明:其實組件代碼不是很多,但是應(yīng)該注意到,我們繼承了ng的一個interface ControlValueAccessor,這里我覺的是比較值得侃的地方。這是ng的一個forms API,可以方便原生DOM和ng forms傳值。在組件元數(shù)據(jù)中這樣定義
@Component({
selector: 'radiogroup',
templateUrl: './radiogroup.component.html',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RadioGroupComponent),
multi: true,
}]
})
其中,這里面有兩個重要的方法需要overwrite,不錯,就是registerOnChange和registerOnTouched,這兩個方法在angular中是這樣定義和使用的

他們分別是在formcontrol的updateOn(這個屬性可以自定義)屬性值為change或者blur的時候調(diào)用。因此,我們在重寫這兩個方法的時候應(yīng)該注意,是重寫一個還是都要重寫。本組件兩個方法都重寫了,因為值變更的時機(jī)自定義成了blur。
三、這就是我的關(guān)于radio組件的封裝開發(fā),還請各位大牛朋友們多多指點(diǎn),后續(xù)會繼續(xù)推出關(guān)于Angular的開發(fā)以及研究。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
angular 數(shù)據(jù)綁定之[]和{{}}的區(qū)別
這篇文章主要介紹了angular 數(shù)據(jù)綁定之[]和{{}}的區(qū)別,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
詳解Angular2 關(guān)于*ngFor 嵌套循環(huán)
這篇文章主要介紹了詳解Angular2 關(guān)于*ngFor 嵌套循環(huán),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
Angular中AuthGuard路由守衛(wèi)的創(chuàng)建使用
這篇文章主要為大家介紹了Angular中AuthGuard路由守衛(wèi)的創(chuàng)建使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Ionic + Angular.js實現(xiàn)圖片輪播的方法示例
圖片輪播在我們?nèi)粘i_發(fā)中是再熟悉不過的了,下面這篇文章主要給大家介紹了Ionic + Angular實現(xiàn)圖片輪播的方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面來一起看看吧。2017-05-05
在AngularJS框架中處理數(shù)據(jù)建模的方式解析
這篇文章主要介紹了在AngularJS框架中處理數(shù)據(jù)建模的方式,作者同時也對AngularJS使用過程中的一些"坑"作了介紹,需要的朋友可以參考下2016-03-03

