Angular7(如下簡稱ng7),已經跟以前版本大有不一樣。新建工程後,可方便建立library(簡稱lib),lib是什麼呢?就是一個npm包的源碼包。npm做爲強大的包管理器,已經成爲不少FEer分享智慧成果的法器。本文主要介紹本人寫的一個radio組件。html
// 安裝ng cli npm install -g @angular/cli // 新建工程 ng new ng-project // 進入ng-project 建立一個lib ng generate library radio
<!--說明:這實際上是一個radio-group 由於radio通常都是分組使用,這裏有幾個注意點 一、組內radio的name屬性保持一致、組外保持惟一 二、經過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>
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的一個forms API,能夠方便原生DOM和ng forms傳值。在組件元數據中這樣定義npm
@Component({ selector: 'radiogroup', templateUrl: './radiogroup.component.html', providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => RadioGroupComponent), multi: true, }] })
的數組
注意,是重寫一個仍是都要重寫。本組件兩個方法都重寫了,由於值變動的時機自定義成了blur。ide