我有一个自动完成输入字段,它对用户输入做出反应并执行搜索功能。我设置了一个过滤器,以便仅在输入值包含两个以上字符时才开始搜索。由于我在
options$
循环中显示 *ngFor
,因此如果过滤器触发,我想返回一个空数组,因此下拉列表不会显示任何结果。
如果用户开始输入,这效果很好,但如果他们删除整个输入,则上次搜索的结果仍然可见。
所以基本上我想做的是,如果过滤器语句触发,则返回一个空数组。
public control = new FormControl()
this.options$ = this.control.valueChanges.pipe(
debounceTime(300),
distinctUntilChanged(),
filter((val) => val.length > 2),
switchMap((search) => this.filterFunc<T>(search))
);
我尝试引入另一个布尔值,它可以处理下拉列表的打开和关闭状态,但我认为必须有一种方法可以实现这一点,而无需强制设置值。
您实际上并不想过滤,因为如果长度小于 2,过滤器将阻止流发出任何值,但在这种情况下您确实想做一些事情(返回一个空数组)而不是实际过滤它.
因此您可以删除
filter
并在 switchMap
本身中处理此情况:
public control = new FormControl()
this.options$ = this.control.valueChanges.pipe(
debounceTime(300),
distinctUntilChanged(),
switchMap((search) => search.length > 2 ? this.filterFunc<T>(search) : of([]))
);