angular - 如何为角度表创建输入过滤器?
问题描述
我正在尝试在 Angular 11 项目中实现一个带有输入过滤器的表。该表由 SERVICE 填充:
export class Service{
url='myUrl';
http;
constructor(private http:HttpClient){
this.http=http
}
loadAll(): Observable<Author[]> {
return this.http.get<Author[]>(this.url)
}
在我的组件中,我有一个变量“filteredAuthors$”,它将代表表中显示的所有数据。
export class MyComponent{
authors$:Observable<Author[]>
filteredAuthors$:Observable<Author[]>
//form that receive the input filter
filterForm:FormControl
constructor(private service:Service){
this.authors$=service.loadAll()
filterForm=new ForControl('')
this.filteredAuthors$=filterForm.valueChanges.pipe(
startWith('').withLatestFrom(this.authors$),
map(
([typedValue, authors])=>!typedValue ? authors :
authors.filter(author=>author.name.includes(typedValue))
)))}}
使用此代码,我总是以 0 行开始我的表格,并且在我输入一些内容后,过滤器工作得很好。另一个奇怪的事情是,当我用“of”方法创建的模拟可观察对象替换我的服务时,表从所有行开始,并在过滤器中的第一个输入之后被过滤。我没有看到什么?作者类型为:
export type Author={
id:string,
name:string
}
解决方案
of
是同步的,因此您将跳过延迟可观察的所有可能的异步副作用——例如网络调用。withLatestFrom
将阻塞直到给定的 observable 发出事件。因此,直到 authors$ 完成(假设是网络调用),管道下的处理被抑制。(这里的第二个例子证实了https://www.learnrxjs.io/learn-rxjs/operators/combination/withlatestfrom)
推荐阅读
- indexeddb - 如何将多级对象映射到 indexedDB 以获得最佳效率
- ios - 无法为我的应用添加新的 iOS 版本
- php - 查询 Mysql 的唯一值
- python - 如何将 dask 数据框的所有部分合并在一起
- laravel-socialite - laravel socialite facebook登录错误此授权码已被使用
- python - 在同一 qtchart 上绘制烛台和 5 天平均线,但给出两个 x 轴图
- python - randomly positioned circle clicking game
- solidity - Truffle 测试因 TypeError 而失败
- azure - 如何使用来自 Internet 的私有 IP 地址 ssh 到 Azure VM
- django - DJango 如何编写用于登录和注册以及注销的 view.py