Sign Up

Sign In

Forget Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

You must login to ask question.

How to implement a debounce time in keyup event in Angular 6

  • 0

I create an Angular app that search students from API. It works fine but it calls API every time an input value is changed. I’ve done a research that I need something called debounce ,but I don’t know how to implement this in my app.

App.component.html

    <div class="container">
  <h1 class="mt-5 mb-5 text-center">Student</h1>
<div class="form-group">
  <input  class="form-control form-control-lg" type="text" [(ngModel)]=q (keyup)=search() placeholder="Search student by id or firstname or lastname">
</div>
 <hr>
 <table class="table table-striped mt-5">
    <thead class="thead-dark">
      <tr>
        <th scope="col" class="text-center" style="width: 10%;">ID</th>
        <th scope="col" class="text-center" style="width: 30%;">Name</th>
       <th scope="col" style="width: 30%;">E-mail</th>
        <th scope="col" style="width: 30%;">Phone</th> 
      </tr>
    </thead>
    <tbody>
      <tr *ngFor="let result of results">
        <th scope="row">{{result.stu_id}}</th>
        <td>{{result.stu_fname}} {{result.stu_lname}}</td>
         <td>{{result.stu_email}}</td>
        <td>{{result.stu_phonenumber}}</td> 
      </tr>
    </tbody>
  </table>
</div>

App.component.ts

import { Component} from '@angular/core';
import { Http,Response } from '@angular/http';
import { Subject, Observable } from 'rxjs';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent  {


  results;
  q = '';

  constructor(private http:Http) {


  }


  search() {
    this.http.get("https://www.example.com/search/?q="+this.q)
    .subscribe(
      (res:Response) => {
          const studentResult = res.json();
          console.log(studentResult);
          if(studentResult.success) {
            this.results = studentResult.data;
          } else {
            this.results = [];
          }
      }
    )
  }
}

Screenshot Screenshot

I’ve tried something like this but it’s error Property debounceTime does not exist on type Subject<{}>

  mySubject = new Subject();
  constructor(private http:Http)  {
    this.mySubject
    .debounceTime(5000)
    .subscribe(val => {
      //do what you want
    });
  }

and this’s also not work. Property ‘fromEvent’ does not exist on type ‘typeof Observable’

    Observable.fromEvent<KeyboardEvent>(this.getNativeElement(this.term), 'keyup')

So, what’s the correct way to implement this ?

Thank you.

Click to rate this post!
[Total: 0 Average: 0]
Share This Post
Share
  1. In the component you can do somthing like this. Create RxJS Subject, In search method which is called on keyup event, do .next() on this Subject you have created. Then subscribe in ngOnInit() will debounce for 1 second, as in below code.

    searchTextChanged = new Subject<string>();
    constructor(private http:Http) {
    
    }
    
    
    ngOnInit(): void {
        this.subscription = this.searchTextChanged
            .debounceTime(1000)
            .distinctUntilChanged()
            .mergeMap(search => this.getValues())
            .subscribe(() => { });
    }
    
    getValues() {
        return this.http.get("https://www.example.com/search/?q="+this.q)
        .map(
          (res:Response) => {
              const studentResult = res.json();
              console.log(studentResult);
              if(studentResult.success) {
                this.results = studentResult.data;
              } else {
                this.results = [];
              }
          }
        )
    }
    
    search($event) {
        this.searchTextChanged.next($event.target.value);
    }

    rxjs v6 has several breaking changes including simplifying import points for operators. Try installing rxjs-compat, which adds back those import paths until the code has been migrated.

    Import the necessary operators from RxJS. Below ones are for RxJS 5.x

    import { Subject } from "rxjs/Subject";
    import "rxjs/add/operator/debounceTime";
    import "rxjs/add/operator/distinctUntilChanged";
    import { Observable } from "rxjs/Observable";
    import "rxjs/add/operator/mergeMap";
    • 0
Leave an answer

Leave an answer

Browse

close