本文主要示例在ionic3.x環境下實現一個自定義計數器,實現后最終效果如圖:

1、使用命令創建一個component
ionic g component CounterInput
類似的命令還有:
ionic g page YourPageName //創建新頁面 ionic g directive YourPageName //創建指令 ionic g component YourComponentName //創建組件 ionic g provider YourProviderName //創建服務 ionic g pipe YourPipeName //創建過濾器
命令執行完成后自動生成文件如圖:

2、到這里我們已經初步創建了一個自定義組件,接上來我們需要將我們的組件添加到app.module.ts的declarations數組里,以便其實頁面進行調用。一般情況下我們執行完命令ionic已經自動幫我們添加進來了,但如果沒有的話請自行添加。代碼如下:
import { CounterInputComponent } from '../components/counter-input/counter-input';
.....
@NgModule({
declarations: [
...
CounterInputComponent
...
],
imports: [
...
3、接下來我們具體實現
counter-input.html 頁面代碼如下:
<ion-icon class="add" name="ios-remove-circle-outline" (click)='decrement()'></ion-icon> <ion-input type="number" value="1" [(ngModel)]='counterValue'></ion-input> <ion-icon class="min" name="ios-add-circle-outline" (click)='increment()'></ion-icon>
counter-input.ts 頁面代碼如下:
import { Component, Input, forwardRef } from '@angular/core';
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
@Component({
selector: 'counter-input',
templateUrl: 'counter-input.html',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => CounterInputComponent),
multi: true
}]
})
export class CounterInputComponent implements ControlValueAccessor {
@Input() counterValue: number;
private propagateChange: any = {};
increment() {
this.counterValue++;
this.propagateChange(this.counterValue);//值傳遞
}
decrement() {
this.counterValue--;
this.propagateChange(this.counterValue);//值傳遞
}
/*實現ControlValueAccessor接口部分*/
writeValue(val: number): void {
if (val) {
this.counterValue = val;
}
}
registerOnChange(fn: any): void {
this.propagateChange = fn;
}
registerOnTouched(fn: any): void {
}
setDisabledState?(isDisabled: boolean): void {
}
}
4、到這里我們的自定義控件已經實現完了,下面是調用
<counter-input [(ngModel)]='counterValue'></counter-input>
總結:為了使自定義組件實現雙向綁定(頁面的傳可以傳遞到組件,組件將值修改后又傳遞到頁面),我們實現了ControlValueAccessor接口,實現完ControlValueAccessor接口后我們可以在調用組件的時候直接使用ngModel進行雙向綁定。
參考文檔:
https://blog.thoughtram.io/angular/2016/07/27/custom-form-controls-in-angular-2.html
http://www.jianshu.com/p/a01015d5d83b
