Angular 2 - 消除 keyUp 事件的抖动
Angular 2 - Debouncing a keyUp event
如何消除在 "keyUp" 事件中调用的函数?
这是我的代码:
我的函数
private handleSearch(searchTextValue: string, skip?: number): void {
this.searchTextValue = searchTextValue;
if (this.skip === 0 || typeof skip === "undefined") {
this.skip = 0;
this.pageIndex = 1;
} else {
this.skip = skip;
}
this.searchTextChanged.emit({ searchTextValue: searchTextValue, skip: this.skip, take: this.itemsPerPage });
}
我的HTML
<input type="text" class="form-control" placeholder="{{ 'searchquery' | translate }}" id="searchText" #searchText (keyup)="handleSearch(searchText.value)">
基本上我想要实现的是 handleSearch
在用户停止输入后几分钟被调用。
我发现我可以为此使用 lodash 的 _debounce()
,但我还没有找到如何将它放在我的 keyUp
事件中。
更新:
使用 RXJS 6 管道运算符:
this.subject.pipe(
debounceTime(500)
).subscribe(searchTextValue => {
this.handleSearch(searchTextValue);
});
您可以创建一个 rxjs/Subject 并在 keyup 上调用 .next() 并使用您想要的 debounceTime 订阅它。
我不确定这样做是否正确,但它确实有效。
private subject: Subject<string> = new Subject();
ngOnInit() {
this.subject.debounceTime(500).subscribe(searchTextValue => {
this.handleSearch(searchTextValue);
});
}
onKeyUp(searchTextValue: string){
this.subject.next(searchTextValue);
}
HTML:
<input (keyup)="onKeyUp(searchText.value)">
Rx/JS6 的更新。
使用管道运算符。
import { debounceTime } from 'rxjs/operators';
this.subject.pipe(
debounceTime(500)
).subscribe(searchTextValue => {
this.handleSearch(searchTextValue);
});
其他都一样
看看这里的答案:
这里的文章:https://blog.thoughtram.io/angular/2016/01/06/taking-advantage-of-observables-in-angular2.html(很旧,但仍然不错)。
基本上,您可以使用 Angular Forms 提供的 Observable 对象。
例如,this.myFormGroup.get("searchText").valueChanges.pipe(debounceTime(500), distinctUntilChanged()).subscribe(...)
如果您需要在用户停止输入时执行 HTTP 请求,您可以将此类 HTTP 调用放入 switchMap
运算符并将其添加到 pipe
列表:
this.myFormGroup.get("searchText")
.valueChanges
.pipe(debounceTime(500),
distinctUntilChanged(),
switchMap((value: string) => {
return this.service.getData(value);
}))
.subscribe((valueFromRest) => { ... });
switchMap
中的魔法会自动取消之前的HTTP请求(如果还没有完成的话)并自动开始一个新的。
如何消除在 "keyUp" 事件中调用的函数?
这是我的代码:
我的函数
private handleSearch(searchTextValue: string, skip?: number): void {
this.searchTextValue = searchTextValue;
if (this.skip === 0 || typeof skip === "undefined") {
this.skip = 0;
this.pageIndex = 1;
} else {
this.skip = skip;
}
this.searchTextChanged.emit({ searchTextValue: searchTextValue, skip: this.skip, take: this.itemsPerPage });
}
我的HTML
<input type="text" class="form-control" placeholder="{{ 'searchquery' | translate }}" id="searchText" #searchText (keyup)="handleSearch(searchText.value)">
基本上我想要实现的是 handleSearch
在用户停止输入后几分钟被调用。
我发现我可以为此使用 lodash 的 _debounce()
,但我还没有找到如何将它放在我的 keyUp
事件中。
更新: 使用 RXJS 6 管道运算符:
this.subject.pipe(
debounceTime(500)
).subscribe(searchTextValue => {
this.handleSearch(searchTextValue);
});
您可以创建一个 rxjs/Subject 并在 keyup 上调用 .next() 并使用您想要的 debounceTime 订阅它。
我不确定这样做是否正确,但它确实有效。
private subject: Subject<string> = new Subject();
ngOnInit() {
this.subject.debounceTime(500).subscribe(searchTextValue => {
this.handleSearch(searchTextValue);
});
}
onKeyUp(searchTextValue: string){
this.subject.next(searchTextValue);
}
HTML:
<input (keyup)="onKeyUp(searchText.value)">
Rx/JS6 的更新。 使用管道运算符。
import { debounceTime } from 'rxjs/operators';
this.subject.pipe(
debounceTime(500)
).subscribe(searchTextValue => {
this.handleSearch(searchTextValue);
});
其他都一样
看看这里的答案:
这里的文章:https://blog.thoughtram.io/angular/2016/01/06/taking-advantage-of-observables-in-angular2.html(很旧,但仍然不错)。
基本上,您可以使用 Angular Forms 提供的 Observable 对象。
例如,this.myFormGroup.get("searchText").valueChanges.pipe(debounceTime(500), distinctUntilChanged()).subscribe(...)
如果您需要在用户停止输入时执行 HTTP 请求,您可以将此类 HTTP 调用放入 switchMap
运算符并将其添加到 pipe
列表:
this.myFormGroup.get("searchText")
.valueChanges
.pipe(debounceTime(500),
distinctUntilChanged(),
switchMap((value: string) => {
return this.service.getData(value);
}))
.subscribe((valueFromRest) => { ... });
switchMap
中的魔法会自动取消之前的HTTP请求(如果还没有完成的话)并自动开始一个新的。