javascript - debounceTime 使表单控件运行两次

标签 javascript angular

我正在使用 debounceTime 在下拉列表中获取列表,到目前为止一切正常我输入了三个字符并触发 api 调用返回给我一个列表,但问题是当我从 Control 的 valueChanges 列表中选择一项会导致再次调用,这是不必要的。如何预防?

这是我的代码:

this.myForm.controls['control'].valueChanges.pipe(
      filter(text => text.length > 2),
      debounceTime(1000),
      distinctUntilChanged()).subscribe((value: string) => {
        this.getItem(value);
});

最佳答案

我认为最好为您正在寻找文本输入的表单控件提供一个 Id,如下所示:

<input type="text" id="inputText">

然后只使用该表单控件在输入时获取数据,如下例所示:

  ngOnInit() {
    const inputText = document.getElementById('inputText');
    const typeahead = fromEvent(inputText, 'input').pipe(
      map((e: KeyboardEvent) => (<HTMLInputElement>e.target).value),
      filter(text => text.length > 2),
      debounceTime(10),
      distinctUntilChanged()
   );

    typeahead.subscribe(data => {
      this.getItem(data);
    });
  }

然后它只会在你在那个输入表单 Controller 上打字时触发

Working DEMO

关于javascript - debounceTime 使表单控件运行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59242937/

相关文章:

javascript - jQuery 延迟触发事件

javascript - 重定向到 App.js 中 componentDidMount 上的 url

javascript - 仅当元素加载时才运行 vue 组件

Angular 2/4 : Reactive forms are synchronous while template-driven forms are asynchronous, 怎么办?

html - 为什么我的 Angular 应用程序显示我的 html 文件的路径而不是它的内容?

javascript - 通过 vba 从 ie 触发 javascript

javascript - 如何在 VueJS 项目中将 leaflet-semicircle 与 vue2-leaflet 一起使用?

css - 网站无法在 https 上正确加载

javascript - angular 2 访问组件内的 ng-content

Angular 2 Material 步进器不工作