The RxJS fromEvent is a creation function that emits events.
How Does It Work?
The fromEvent creation function takes in an event target object and event type string, creates an Observable, and emits the specified events as they occur.
It works with any document object model (DOM) element, such as buttons, input elements, and the document itself.
Find the list of valid event types in the Mozilla docs here.
The above example watches for click events on the myInput element.
Each click event is emitted and logged to the console.
How About Some Examples?
This example watches for click events anywhere on the document (web page). When a click event is emitted, it's x and y coordinates are logged.
// Click event on the document page
fromEvent(document, 'click').subscribe(
(x: MouseEvent) => console.log(`x: ${x.x}, y: ${x.y}`)
);
The following example first locates the element with an id of name. It then watches for keyup events in the name element. Each keyup event is emitted and it's key code is logged to the console.
// Keyup event on an input element
var input = document.getElementById('name');
fromEvent(input, 'keyup').subscribe(
(x: KeyboardEvent) => console.log(`key: ${x.code}`)
);
Here is a more complete Angular example. In the template, it uses a template reference variable (filterInput) on an input element.
Template
<input type='text' #filterInput/>
In the component, it uses the ViewChild decorator to locate the element using the template reference variable (filterInput). In the ngAfterViewInit lifecycle hook method, it uses the fromEvent creation function, passing in the found element and the desired event (keyup).
Component
import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
import { fromEvent } from 'rxjs';
@Component({
templateUrl: './product-list.component.html'})
export class ProductListComponent implements AfterViewInit {
@ViewChild('filterInput') filterElementRef: ElementRef;
ngAfterViewInit(): void {
fromEvent(this.filterElementRef.nativeElement, 'keyup').subscribe(
(x: KeyboardEvent) => console.log(`key: ${x.code}`)
);
}
}
Note that there are often more "Angular" ways to accomplish event handling using event binding. Consider using event binding as a first choice and only use
fromEventif event binding doesn't provide the features you require.
What Are Some Common Uses?
Here are some common uses of the fromEvent creation function.
Tracking and responding to click events.
fromEvent(document, 'click')
Tracking and responding to keyboard events.
fromEvent(input, 'keyup')
Tracking and responding to clipboard events.
fromEvent(document, 'paste')
Where's the Code?
Here is a link to sample code demonstrating the fromEvent creation function. Feel free to fork it and try it out.
What About the Marble Diagram?
This is the fromEvent creation function shown on a marble diagram:

Thanks to @michael_hladky for this marble diagram.
Do you have another common use of fromEvent? If so, please leave a comment.
Enjoy!

Top comments (0)