Angular 2+ の debounce 解説
Angular 2+ での debounce の解説
debounce の仕組み
- イベントリスナー
ターゲット要素にイベントリスナーを登録します。 - タイマー設定
イベントが発生すると、一定時間のタイマーを設定します。 - タイマーの処理
タイマーがタイムアウトするまで、イベントをキューに蓄積します。
Angular 2+ では、debounceTime
というパイプライン演算子を使用して、簡単に debounce を実装できます。
import { Component, OnInit } from '@angular/core';
import { debounceTime, Subject } from 'rxjs';
@Component({
selector: 'app-debounce-example',
templateUrl: './debounce-example.component.html',
styleUrls: ['./debounce-example.component .css']
})
export class DebounceExampleComponent implements OnInit {
searchTerms = new Subject<string>();
constructor() { }
ngOnInit(): void {
this.searchTerms
.pipe(debounceTime(400))
.subscribe(term => {
// 検索処理を実行
console.log('Search term:', term);
});
}
}
この例では、searchTerms
という Subject
を作成し、ユーザーの入力を受け取っています。debounceTime(400)
を使用して、400ミリ秒間入力がない場合にのみ検索処理を実行するようにしています。
- コードの簡潔さ
debounceTime
パイプライン演算子を使用することで、コードを簡潔に記述できます。 - ユーザー体験の向上
過剰なイベント処理による画面のちらつきや遅延を防止します。
import { Component, OnInit } from '@angular/core';
import { debounceTime, Subject } from 'rxjs';
@Component({
selector: 'app-debounce-example',
templateUrl: './debounce-example.component.html',
styleUrls: ['./debounce-example.component .css']
})
export class DebounceExampleComponent implements OnInit {
searchTerms = new Subject<string>();
constructor() { }
ngOnInit(): void {
this.searchTerms
.pipe(debounceTime(400))
.subscribe(term => {
// 検索処理を実行
console.log('Search term:', term);
});
}
}
解説
subscribe
ブロック内では、検索処理を実行します。debounceTime(400)
は、400ミリ秒間入力がない場合にのみ、subscribe
ブロック内の処理を実行するようにします。searchTerms
は、ユーザーの入力を受け取るためのSubject
です。
RxJS の debounce オペレーター
RxJS の debounce
オペレーターは、debounceTime
と同様の機能を提供します。ただし、より柔軟な制御が可能で、カスタムの条件に基づいて debounce を実装することができます。
import { Component, OnInit } from '@angular/core';
import { debounce, Subject } from 'rxjs';
@Component({
selector: 'app-debounce-example',
templateUrl: './debounce-example.component.html',
styleUrls: ['./debounce-example.component .css']
})
export class DebounceExampleComponent implements OnInit {
searchTerms = new Subject<string>();
constructor() { }
ngOnInit(): void {
this.searchTerms
.pipe(debounce(() => timer(400)))
.subscribe(term => {
// 検索処理を実行
console.log('Search term:', term);
});
}
}
この例では、debounce
オペレーターを使用して、400ミリ秒後にイベントを処理するよう設定しています。
手動実装
debounce を手動で実装することも可能です。これにより、より細かい制御が可能になりますが、コードが複雑になる可能性があります。
import { Component, OnInit } from '@angular/core';
import { Subject } from 'rxjs';
@Component({
selector: 'app-debounce-example',
templateUrl: './debounce-example.component.html',
styleUrls: ['./debounce-example.component .css']
})
export class DebounceExampleComponent implements OnInit {
searchTerms = new Subject<string>();
debounceTimer: any;
constructor() { }
ngOnInit(): void {
this.searchTerms.subscribe(term => {
clearTimeout(this.debounceTimer);
this.debounceTimer = setTimeout(() => {
// 検索処理を実行
console.log('Search term:', term);
}, 400);
});
}
}
この例では、タイマーを使用して debounce を実装しています。イベントが発生するたびにタイマーをクリアし、新しいタイマーを設定します。
選択基準
どの方法を選択するかは、プロジェクトの要件や開発者の好みによって異なります。debounceTime
パイプライン演算子はシンプルで使いやすいですが、より複雑な制御が必要な場合は、RxJS の debounce
オペレーターまたは手動実装を検討することができます。
- 手動実装: 最も細かい制御が可能だが、コードが複雑になる可能性がある。
- RxJS の
debounce
オペレーター: より柔軟な制御が可能。 debounceTime
パイプライン演算子: シンプルで使いやすい。
javascript angular typescript