我有一个输入搜索元素,可以检测到击键,并且我想使用反跳来限制对API的请求,但我无法使其正常工作。我只是想测试debounceTime和distinctUntilChanged。
我已经尝试过(Keyup),但无法正常工作。
<input (keyup)="onKeyUp($event)" id="testInput" autocomplete="off" type="text" name="searchFilterText" class="m-list-search__form-input" value="" placeholder="Search...">
这是打字稿文件中的代码。
searchInput = document.getElementById('testInput');
observable: any;
/// <summary>
/// Process the search term provided on key up for the input field.
/// </summary>
/// <param name="searchTerm">The search term.</param>
onKeyUp(event: KeyboardEvent) {
//console.log(event);
let element = event.target as HTMLInputElement;
let value = element.value;
this.observable = fromEvent(this.searchInput, event.type)
.debounceTime(500) // millisecs until value gets emitted.
.distinctUntilChanged()
.subscribe(function (event) {
console.log(event.target.value);
});
}
预期结果是控制台日志中使用debounceTime和distinctUntilChanged的延迟搜索结果值。
答案 0 :(得分:3)
您可以尝试以下方法:
模板
<input
id="testInput" autocomplete="off"
type="text" #searchText
name="searchFilterText" class="m-list-search__form-input"
value=""
placeholder="Search...">
请注意模板参考变量:#searchText
。这样就可以访问输入元素,而无需使用getElementById
(通常不建议在Angular应用中使用该元素)。
组件
import { Component, AfterViewInit, ViewChild } from '@angular/core';
import { fromEvent } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
@Component({
templateUrl: './search.component.html'
})
export class SearchComponent implements AfterViewInit {
@ViewChild('searchText') searchTextRef;
ngAfterViewInit() {
if (this.searchTextRef) {
fromEvent(this.searchTextRef.nativeElement, 'keyup')
.pipe(
debounceTime(500),
distinctUntilChanged()
).subscribe(
value => console.log(this.searchTextRef.nativeElement.value)
)
}
}
}
此代码使用@ViewChild
获取对标有#searchText
模板引用变量的元素的引用。
然后它使用与debounceTime
类似的代码。
我在这里有个闪电战:https://stackblitz.com/edit/angular-debounce-deborahk
您可以在此处找到更多信息:Observable.fromEvent - RXJS
注意:如果您使用反应性表单,这甚至会更加容易,因为您可以直接访问表单上任何输入元素的valueChanges
观察值。
活动表格
模板
<input
id="testInput"
[formControl]="search"
autocomplete="off"
type="text"
class="m-list-search__form-input"
value=""
placeholder="Search...">
注意formControl
指令。
组件
// For reactive forms
search = new FormControl();
ngOnInit() {
this.search.valueChanges
.pipe(
debounceTime(500),
distinctUntilChanged()
).subscribe(
value => console.log("Reactive Forms implementation: " + value)
)
}