You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 12 mat-autocomplete绑定Observable数据源无法过滤问题

问题根因

过滤失效的核心原因是zip操作符的特性不符合当前业务场景:zip要求所有上游Observable同时发射新值才会触发下游执行。你的this.ts.tares是HTTP请求类Observable,仅会发射1次接口返回的数据,后续输入框值变化时,只有valueChanges发射新值、tares无新值发射,zip就不会触发过滤逻辑,所以出现选项加载正常但输入无过滤效果、控制台无报错的现象。

另外你的tare服务当前的getter写法存在冗余请求问题:每次访问ts.tares都会触发新的HTTP请求,完全没有用到你定义的cachedTares缓存能力。

修复方案

第一步:优化Tare服务逻辑,避免重复请求

修改你的tare服务代码,添加缓存复用逻辑:

public cachedTares: Tare[] = [];
// 新增私有变量存共享流
private taresStream: Observable<Tare[]> | null = null;

public get tares() {
  // 只在第一次调用时发起请求,后续直接返回缓存流
  if (!this.taresStream) {
    this.taresStream = this.api.getTares()
      .pipe(
        tap(tares => this.cachedTares = tares),
        shareReplay(1) // 缓存最新1次结果,所有订阅复用同一份数据
      );
  }
  return this.taresStream;
}

第二步:替换组件中的组合操作符

将原来的zip替换为withLatestFrom,符合输入变化时取最新下拉选项做过滤的逻辑:

// 替换原来的filteredTares$定义逻辑
this.filteredTares$ = this.collectForm.get('tare_container').valueChanges
  .pipe(
    startWith(''),
    // 每次输入值变化时,自动取最新的tares数据组合
    withLatestFrom(this.ts.tares),
    map(([value, tares]) => {
      if (!value) return tares || [];
      const filterValue = value.toLowerCase();
      return tares.filter(tare => tare.container_name.toLowerCase().includes(filterValue));
    })
  );

修复后逻辑和你正常运行的waste_type autocomplete逻辑完全对齐,也不需要额外传递参数就可以实现输入过滤的效果。

内容的提问来源于stack exchange,提问作者Kevin Dick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:39:03