如何解决“ debounceTime”和“ distinctUntilChanged” |使用打字稿在Angular 5中出现RxJS错误

时间:2019-02-18 23:55:29

标签: angular typescript

我有一个输入搜索元素,可以检测到击键,并且我想使用反跳来限制对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的延迟搜索结果值。

1 个答案:

答案 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)
        )
  }