23

如何消除在“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在用户停止输入后几分钟被调用。

我发现我可以_debounce()为此使用 lodash,但我还没有找到如何在我的keyUp活动中使用它。

4

3 回答 3

55

更新: 使用 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)">
于 2017-03-13T10:23:27.127 回答
23

Rx/JS 6 的更新。使用管道运算符。

import { debounceTime } from 'rxjs/operators';

this.subject.pipe(
      debounceTime(500)
    ).subscribe(searchTextValue => {
      this.handleSearch(searchTextValue);
    });

其他一切都一样

于 2018-09-11T21:26:40.727 回答
2

看看这里的答案:https ://stackoverflow.com/a/35992325/751200

和这里的文章: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 调用放入switchMapoperator 并将其添加到pipe列表中:

this.myFormGroup.get("searchText")
                .valueChanges
                .pipe(debounceTime(500),
                      distinctUntilChanged(), 
                      switchMap((value: string) => {
                          return this.service.getData(value);
                      }))
                .subscribe((valueFromRest) => { ... });

魔法 inswitchMap会自动取消之前的 HTTP 请求(如果它还没有完成)并自动开始一个新的请求。

于 2021-09-20T17:35:49.847 回答