Skip to main content

How to implement a search field in Angular X that starts some action as soon as you stop typing


Everybody knows the Google search that displays some recommendations while you are typing.



Some times when you are developing an application you might need a similar functionality for implementing a kind of free text search to quickly find results in a long list of data stored in a database that might be filtered and delivered by a webservice in the background. 

The requirement:

The search should happen without clicking a button but it should not start right after each single character you have typed. It should wait a short moment and after you have stopped typing immediately start the search.


The implementation is quite simple and the same way you could do that in Javascript.

First we need to prepare our template to have an input field in which the user can type in a search string. 



Whenever the user types a character a function should be called. This is done with the keyup event.

(keyup)="searchChanged($event)"

In our component we have to define a function named 'searchChanged' which receives the event as a parameter.



The parameter 'e' is a keyboard event which contains all information we need and occurs after each character typed in by the user.

Here is the output (partly) in the console window:

The event has a member named 'target' which again has a member named 'value' which is the text the user has typed in. 

In this function we could just start over calling a webservice or somehow trigger a search. But that is not what we want to do because it does not make sense to call a service after each single character.
That means we have to schedule the search to happen after the user has stopped typing for a short moment. 

How to do that?

It is simple. Whenever the user types a character we use setTimeout to schedule a function call i.e. after 400 millis. To prevent that we call that function for each character after waiting for 400 millis we have to cancel already running timers with each character that is typed in. If the user stopps typing a last timer is left and executes after 400 milliseconds.

Here is the code:

To keep the current timer in mind we have to define a variable that references the timer.



Then we can fill in some code into the function 'searchChanged' and add a function that is called by the timer.




First we check if 'timer' is set. If yes the timer is cancelled by calling 'clearTimeout'. Then we schedule a new timer to call the search function by calling setTimeout. The first parameter is the function that should be called, the second parameter is the wait time (400 millis) and the last parameter is what we want to hand over to the search function. As long as the user is typing the function searchChanged is called by each character. The existing timer (that has not yet executed) is cancelled and for the new search token we start another timer. So when the user stops typing for 400 milliseconds the timer will execute and trigger the search.

Done. The basic functionality of a search field is implemented. Now we can feel free to add a minimum length for the search string or handle empty search strings etc.

To demonstrate the difference between immediately searching and triggered/delayed searching I have made a little Plunker which you can find here: 

Open Plunker















Comments

Popular posts from this blog

Angular 2: Multiple instances in the same Application

Requirement:  Use multiple Root-Components in the same Application  This Root-Components use the same Implementations and Services Display the Root-Components on the same Single-Page Solution: App-Module preparation: import { BrowserModule, DOCUMENT } from '@angular/platform-browser'; import { NgModule, Inject, Component } from '@angular/core'; export class AppModule { private browser_document; ngDoBootstrap(appRef){ if(this.browser_document.getElementsByTagName('app-root1').length > 0){appRef.bootstrap(AppComponent1);} if(this.browser_document.getElementsByTagName('app-root2').length > 0){appRef.bootstrap(AppComponent2);} } constructor(@Inject(DOCUMENT) private document: any){ this.browser_document = document; } } Service preparation: Angular 2 has two options to provide a service. 1. Single instance For a multiple implementation of more Root-Components we need the second opt...

Nested Component - Passing Data to a Parent Component

In my previous article  Nested Component - Passing Data to a Child Component , I explained how to pass data from a parent component to a child component.  In this article I will describe how you do the other way, passing data from a child to a parent component. As you know, there is a decorator called @Input for passing data to the child, and of course there is another decorator to passing the data to the parent. This decorator is called @Output. Very obvious. So we have to import this decorator to your parent component import  {  Output  }  from   '@angular/core' ; Now we can use this decorator. The property type of the decorator must be an event. The data to pass becomes the event payload. So we have to import the EventEmitter, too, because in Angular an event is defined with an EventEmitter object. import  {  Output ,  EventEmitter  }  from   '@angular/core' ; Next step is to create a new instance of th...

Utilize 3rd party Javascript libraries in your Angular 2+ application with CLI

Not everything is available as a native Typescript library. Due to that sometimes you might need to use 3rd party libraries. After creating a new project with Angular CLI you will experience that VS Code does not know any libraries you have imported in the header tag and the compiler complains when you try to use this libraries. The reason is: You are missing the typings. The typings describe the functionality of the libary and make that available in your project through intellisense and for the compiler. But before you start creating your own typings do the following checks: 1. Does the vendor of the library provide the typings? If yes, install through npm 2. Are the typings available on definitely typed ? If yes, then take it from there. If this is not the case then you can do your own typings. If you want to do that properly, then you should write the complete set of typings for the library and upload to definitely typed to provide it for the community. OK, this might b...