Angular中如何用单个Subject实现多搜索过滤器的防抖处理
Angular 单 Subject 实现多条件搜索防抖方案
直接给出改造方案,核心是利用 scan 操作符累积参数变更,既保留单 Subject 统一防抖的逻辑,又避免单个输入修改清除其他参数:
组件代码改造
// 先定义搜索参数类型(若未定义) interface SearchParameters { name?: string; bornBefore?: Date; } searchParameters: SearchParameters = {}; // 单一 Subject,接收部分参数更新 queryUpdates$ = new Subject<Partial<SearchParameters>>(); ngOnInit(): void { this.queryUpdates$ .pipe( // 累积合并参数:将每次的部分更新与现有参数对象合并,保留未修改字段 scan((acc, update) => ({ ...acc, ...update }), this.searchParameters), // 防抖300ms,避免频繁触发搜索 debounceTime(300), // 仅当参数实际变化时触发搜索(自定义对象比较逻辑) distinctUntilChanged((prev, curr) => prev.name === curr.name && prev.bornBefore === curr.bornBefore ) ) .subscribe(mergedParams => { this.searchParameters = mergedParams; this.search(); }); }
模板代码改造
修改两个输入的 ngModelChange,每次仅发送对应字段的部分更新:
<input (ngModelChange)="queryUpdates$.next({ name: $event })" [ngModel]="searchParameters.name" id="searchName" name="searchName" type="text" > <input (ngModelChange)="queryUpdates$.next({ bornBefore: $event })" [ngModel]="searchParameters.bornBefore" class="form-control" id="searchDateOfBirth" name="searchDateOfBirth" type="date" >
关键逻辑说明
Partial<SearchParameters>:允许仅传递搜索参数的部分字段,无需每次传完整对象scan操作符:核心作用是累积参数变更,每次收到新的部分更新时,与之前的参数对象浅合并,确保未修改字段不会被清空distinctUntilChanged:自定义对象比较逻辑,避免因每次合并生成新对象而触发无效搜索
内容的提问来源于stack exchange,提问作者2f8n
相关产品推荐
相关产品推荐

