【发布时间】:2021-11-21 14:15:16
【问题描述】:
我使用*ngFor 来显示一个集合,我还有一个input 将用作过滤条件(这个input 是一个formControl)。现在我添加了一个PipeTransform 来根据input 过滤我的收藏。
一切都按预期工作,但我不知道如何去抖动。我希望我的filterPipe 在input 内的最后一次击键后0.5s 被调用,但目前在我的input 内发生任何更改后立即调用它。
HTML:
<div class="test-ctr">
<div class="form-ctr">
<form class="example-form" [formGroup]="filterForm">>
<input formControlName="nick" placeholder="ex. hdw">
</form>
</div>
<div class="app-cards-ctr">
<div class="app-card-ctr" *ngFor="let nick of nicks | filterPipe: filterForm.get('nick')?.value">
<app-card [nick]="nick"></app-card>
</div>
</div>
</div>
Component.ts:
import { Component, OnInit } from '@angular/core';
import { FormBuilder } from '@angular/forms';
@Component({
selector: 'app-test',
templateUrl: './test.component.html',
styleUrls: ['./test.component.scss'],
})
export class TestComponent implements OnInit {
nicks: string[] = ['Siema', 'Elo', 'Tu', 'Hdw3DCtV', 'and', 'Gównow', 'Zdzisiu11', 'Zdzisiu1','Zdzisiu2','Zdzisiu3','Zdzisiu4','Zdzisiu5'];
constructor(private formBuilder: FormBuilder) {}
filterForm = this.formBuilder.group({
nick: ['']
})
ngOnInit(): void {}
}
Pipe.ts:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({ name: 'filterPipe', pure: true })
export class FilterPipe implements PipeTransform {
transform(value: string[], arg: string): string[] {
console.log(arg);
return value.filter(
(e) => e.toLowerCase().indexOf(arg.toLowerCase()) !== -1
);
}
}
【问题讨论】:
-
从未尝试过这个,但也许这个? filterPipe: (filterForm.get('nick')?.valueChanges.pipe(debounceTime(500)) | async)
-
@MikeOne 我已经尝试过了,但它仍然会立即触发 filterPipe 的任何更改。我没有对它进行太多调查,所以也许我做错了什么,但我认为如果我在那里订阅,而不是在调用 filterPipe 之前,这种情况下的去抖动会发生在 filterPipe 内部。我想我需要以某种方式延迟我的 from 所以它不会立即检测到变化,但我不知道这是否可能或者这是否是一个好的解决方案
标签: angular typescript filter pipe debounce