Angular2でonchangeイベントハンドラーを作成する方法
Angular2におけるonchangeの同等の機能
(change)イベントバインディング
最も簡単な方法は、(change)
イベントバインディングを使用することです。これは、DOMのchange
イベントにリスナーを登録するものです。
例:
<input type="text" [(ngModel)]="name" (change)="onChange()">
この例では、name
プロパティが変更されたときにonChange()
関数が呼び出されます。
ngModelChangeイベントバインディング
ngModel
ディレクティブを使用している場合は、ngModelChange
イベントバインディングを使用できます。これは、ngModel
プロパティの値が変更されたときに呼び出されます。
<input type="text" [(ngModel)]="name" (ngModelChange)="onChange($event)">
ngModelプロパティへの直接アクセス
ngModel
ディレクティブを使用している場合は、ngModel
プロパティに直接アクセスして、その値が変更されたかどうかを確認できます。
<input type="text" [(ngModel)]="name">
<script>
const nameInput = document.querySelector('input');
nameInput.addEventListener('change', () => {
// nameプロパティの値が変更された
});
</script>
この例では、name
プロパティの値が変更されたときにchange
イベントが発生し、そのイベントリスナー内で処理を実行できます。
ControlValueAccessorインターフェース
より複雑な要件の場合は、ControlValueAccessor
インターフェースを実装することで、独自のonchange
イベントハンドラーを作成できます。
詳細は、Angularの公式ドキュメントを参照してください。
- シンプルな要件の場合は、
(change)
イベントバインディングを使用するのが最も簡単です。 ngModel
プロパティの値にアクセスする必要がある場合は、ngModelChange
イベントバインディングを使用できます。
Angular2には、onchange
イベントに相当する機能をいくつかの方法で実現できます。どの方法を使用するべきかは、要件によって異なります。
(change)イベントバインディング
<input type="text" [(ngModel)]="name" (change)="onChange()">
export class MyComponent {
name = '';
onChange() {
// nameプロパティが変更されたときの処理
}
}
ngModelChangeイベントバインディング
<input type="text" [(ngModel)]="name" (ngModelChange)="onChange($event)">
export class MyComponent {
name = '';
onChange(event: any) {
// nameプロパティの値が変更されたときの処理
// eventオブジェクトから変更前の値などを取得できます
}
}
ngModelプロパティへの直接アクセス
<input type="text" [(ngModel)]="name">
export class MyComponent {
name = '';
constructor() {
const nameInput = document.querySelector('input');
nameInput.addEventListener('change', () => {
// nameプロパティの値が変更されたときの処理
});
}
}
ControlValueAccessorインターフェース
ngOnChangesライフサイクルフック
<input type="text" [(ngModel)]="name">
export class MyComponent implements OnChanges {
name = '';
ngOnChanges(changes: SimpleChanges) {
if (changes['name']) {
// nameプロパティが変更されたときの処理
}
}
}
Subject
を使用すると、コンポーネント間でデータ変更を通知できます。
<input type="text" [(ngModel)]="name">
<button (click)="changeName()">名前を変更</button>
export class MyComponent {
name = '';
nameChange = new Subject<string>();
changeName() {
this.name = '新しい名前';
this.nameChange.next(this.name);
}
}
<app-other-component [name]="nameChange | async"></app-other-component>
export class OtherComponent {
name: string;
constructor() {
this.nameChange.subscribe(name => {
// nameプロパティが変更されたときの処理
});
}
}
RxJS
を使用すると、より複雑なデータ変更処理を記述できます。
angular