javascript - Angular 为 2 的输入去抖动

标签 javascript html angular typescript

在应用程序中,我需要在输入去抖动时发送一个事件。

我正在尝试这个:

   @ViewChild('messageInput') messageInput: ElementRef;
   private inputTimeOutObservable: any;

    setTypingTimeOut(){
          this.inputTimeOutObservable = Observable.fromEvent(this.messageInput.nativeElement, 'input')
            .map((event: Event) => (<HTMLInputElement>event.target).value)
            .debounceTime(1000)
            .distinctUntilChanged()
            .subscribe(data => {
              this.sendEvent();
            });
    }
    ngOnDestroy() {
        if (this.inputTimeOutObservable) {
          this.inputTimeOutObservable.unsubscribe();
          this.inputTimeOutObservable = null;
        }
      }

输入做其他事情但这里是:

 <input #messageInput id="message" type="text" (ngModelChange)="inputTextChanges($event)"
               [(ngModel)]="messageValue" (keyup)='keyUp.next($event)'>

事件没有触发,我在这里不明白为什么。有什么想法吗?

最佳答案

根据您的代码,这是一个工作示例:

component.html

<input #messageInput id="message" type="text" [(ngModel)]="messageValue">

component.ts

import {Component, ElementRef, OnInit, ViewChild} from '@angular/core';
import {Observable} from "rxjs/Rx";

@Component({
  selector: 'app-input-debounce',
  templateUrl: './input-debounce.component.html',
  styleUrls: ['./input-debounce.component.css']
})
export class InputDebounceComponent implements OnInit {
  @ViewChild('messageInput') messageInput: ElementRef;
  public messageValue: string = "";
  private inputTimeOutObservable: any;

  constructor() {
  }

  ngOnInit() {
  }

  ngAfterViewInit() {
    this.setTypingTimeOut();
  }

  setTypingTimeOut() {

    this.inputTimeOutObservable = Observable.fromEvent(this.messageInput.nativeElement, 'input')
      .map((event: Event) => (<HTMLInputElement>event.target).value)
      .debounceTime(1000)
      .distinctUntilChanged()
      .subscribe(data => {
        console.log(this.messageValue);
        console.timeEnd("Input changed after."); // No matter how frequent you type, this will always be > 1000ms
        console.time("Input changed after."); // start track input change fire time
      });
  }

}

关于javascript - Angular 为 2 的输入去抖动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48992384/

相关文章:

javascript - 为什么++i 在 for 循环之前不递增 i?

html - 了解菜单在 html5 和 css3 中的工作原理

angular - 如何将 Angular 2 数据网格绑定(bind)到 Angular 4 FormArray

javascript - 如何在 Angular 2 中发出 @Output 事件

css - 在 Angular 2/Angular-CLI 中将 CSS 排除在 JS 之外

javascript - ng-repeat 不显示行

javascript - 谁提供了 Express 中间件中的 next() 功能?

javascript - 在排序列表周围包装 div

javascript - 如何使用 select ng-options 实现有效的空选项

javascript - 引导 slider : when a specific slide is active show or hide divs