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 = () => { }
}
複製代碼
@Component({
selector: 'radiogroup',
templateUrl: './radiogroup.component.html',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RadioGroupComponent),
multi: true,
}]
})
複製代碼