表单的ValueChanges中的角度去抖动

问题描述

我有一个名为filteredUserNames的列表,其中包含很多用户。每次更改表单上的值时,都会启动新的数据过滤器。我知道要延迟时间,以便不是每个字符都会触发一个新的过滤器,因此我需要使用反跳功能,但是我不确定在哪里添加它。它应该在值更改订阅中吗?还有正确的实现方法是什么?

我有

searchString = new BehaviorSubject("");
searchString$ = this.searchString.asObservable();

在构造函数

this.myForm = this.fb.group({
  searchString: [""],});
this.myForm.controls.searchString.valueChanges.subscribe((val) => {
// SHOULD THE DEBOUNCE GO HERE ?? //  
this.searchString.next(val);  
}

在ngOnInit

this.searchString$.subscribe((searchTerm) => {
      console.log(this.userNames);
      if (this.userNames !== undefined) {
      this.filteredUserNames = this.userNames.filter(
        (userName) =>
          userName.searchTerms
            .toLowerCase()
            .indexOf(searchTerm.toLowerCase()) !== -1
      );
      };
    });

解决方法

尝试此操作,您可以添加 distinctUntilChanged 来忽略相似的值,并添加 tap 副作用,这在您的情况下会向bahviorSubject发出新的值

import { tap,distinctUntilChanged,debounceTime} from 'rxjs/operators';
...

this.myForm.controls.searchString.valueChanges.pipe(
   debounceTime(400),distinctUntilChanged(),tap((val) => this.searchString.next(val))    
 ).subscribe()