表单 ValueChanges 内的角度反跳

Pau*_*ard 3 javascript rxjs behaviorsubject angular

我有一个名为filteredUserNames 的列表,其中包含很多用户。每次我更改表单上的值时,它都会启动一个新的数据过滤器。我知道为了延迟时间,以便不是每个角色都会触发新的过滤器,我需要使用去抖动,但我不确定在哪里添加它。它应该在值更改订阅内吗?另外,正确的实施方法是什么?

我有

searchString = new BehaviorSubject("");
searchString$ = this.searchString.asObservable();
Run Code Online (Sandbox Code Playgroud)

在构造函数中

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

在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
      );
      };
    });
Run Code Online (Sandbox Code Playgroud)

Fat*_*med 5

尝试这个,你可以添加 distinctUntilChanged来忽略类似的值,并为你的副作用添加tap运算符,在你的情况下,它会向你的behaviorSubject发出一个新值

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

this.myForm.controls.searchString.valueChanges.pipe(
   debounceTime(400),
   distinctUntilChanged(),
   tap((val) => this.searchString.next(val))    
 ).subscribe()
Run Code Online (Sandbox Code Playgroud)