Angular and RxJS: Refresh a Component From Another

RxJS is Reactive Extensions of JavaScript. It provides various handy Observables and Operators to work with in Angular. It becomes important in scalable application development. This tutorial will guide you to reload or refresh a component from another using RxJS Observables. I will use a common service that will be responsible to keep the event emitters.

Real examples

Building a large-scale application requires an optimized and well-structured code, only then it will give the best performance measurement. There are many situations where we need to refresh a part of a component from another component’s action. Here are a few of them.

Refresh data table at component after action on another

This is the most common scenario when building an application. You have a data table on the list component and there is another component for Add/Edit/Delete. You want to refresh the data table when a record is added/edited/deleted.

Reload a dropdown after action on a different component

A dropdown data can be refreshed using RxJS Subject or EventEmitter from a different component. It requires a common service to be used by both of the components. Emit the event from source component and subscribe to the listener. Reload the data in the subscription.

Refresh multi-lingual content explicitely

This situation happens when the Angular’s Change Detection is not able to detect the language change button click. In that case, you want to manually emit an event at language change action and refresh the multi-language content.


You can use any one of the below events generation mechanism to implement any of the above examples. You can also use it in any other use case as per your requirement. Let’s start code implementation.

Refresh a Component From Another Using RxJS

RxJS observables and operators will be used to reload a part of data at a component from a different component. We will look into the ways one by one with examples.

Reload part of component using RxJS Subject

RxJS Subject is an Observable that is used to multicast the event to multiple observers. We will use Subject to notify the component on some action and reload the part.

data.service.ts


import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class DataService {
  subjectNotifier: Subject = new Subject();

  constructor() { }

  notifyAboutChange() {
    this.subjectNotifier.next();
  }
}

A variable subjectNotifier with Subject Data Type is declared. null type is passed in the Subject argument because I don’t need to send any value with notification. If you want to send a value along with the notification, you can specify there the value type and send the value in this.subjectNotifier.next();

Call the notifyAboutChange method from the origin component.

sender.component.ts

This is the event originator component. An event will be emitted on add/edit/delete record or as per your requirement. The event will be then subscribed by the receiver component.


import { Component, OnInit } from '@angular/core';
import { DataService } from '../data.service';

@Component({
  selector: 'app-sender',
  templateUrl: './sender.component.html',
  styleUrls: ['./sender.component.scss']
})
export class SenderComponent implements OnInit {

  constructor(private dataService: DataService) { }

  ngOnInit(): void {
    this.notifyForChange(); // call this method after add/edit/delete or as per your requirement
  }

  notifyForChange() {
    this.dataService.notifyAboutChange();
  }
}

receiver.component.ts

Subscribe to the event in receiver component.


import { Component, OnDestroy, OnInit } from '@angular/core';
import { Subscription } from 'rxjs';
import { DataService } from '../data.service';

@Component({
  selector: 'app-receiver',
  templateUrl: './receiver.component.html',
  styleUrls: ['./receiver.component.scss']
})
export class ReceiverComponent implements OnInit, OnDestroy {

  notifierSubscription: Subscription = this.dataService.subjectNotifier.subscribe(notified => {
    // originator has notified me. refresh my data here.
  });

  constructor(private dataService: DataService) { }

  ngOnInit(): void {
  }

  ngOnDestroy() {
    this.notifierSubscription.unsubscribe();
  }
}

Note: I have used a Subscription variable notifierSubscription. I can unsubscribe it in ngOnDestroy to prevent memory leaks when component is destroyed.

Refresh part of component using EventEmitter

data.service.ts

Declare an EventEmitter variable.


eventEmitterNotifier: EventEmitter = new EventEmitter();

Again, I am using null value in the EventEmitter argument because I don’t need to pass any value. I only need to notify my listener. If you need to pass data along with event notification, you can provide the data reference and pass the value while emitting the event.

Emit the event.


notifyAboutChange() {
  this.eventEmitterNotifier.emit();
}

Call the emit() method in notifyAboutChange in data.service.ts file. Consume notifyAboutChange method from sender component to emit event.

sender.component.ts

Call the notifyAboutChange service method to emit the event on add/edit/delete action or any other action as per your need.


constructor(private dataService: DataService) { }

ngOnInit(): void {
  this.notifyForChange(); // call this method after add/edit/delete or as per your requirement
}

notifyForChange() {
  this.dataService.notifyAboutChange();
}

This will invoke the event and the listener will be notified immediately.

receiver.component.ts

Subscribe to the event in the same way we did for the RxJS Subject.


notifierSubscription: Subscription = this.dataService.eventEmitterNotifier.subscribe(notified => {
  // originator has notified me. refresh my data here.
});

constructor(private dataService: DataService) { }

ngOnInit(): void {
}

ngOnDestroy() {
  this.notifierSubscription.unsubscribe();
}

Note: Unsubscribe the subscription in ngOnDestroy to prevent unnecessary memory leakage.

Conclusion

Events generation is one of the most used mechanisms in Angular development. RxJS comes to mind when implementing such use cases. This article explains how to refresh a part of component from another component with the help of RxJS Observables.

Read How to Pass Data Between Components Using RxJS.

Also Read:

Leave a Reply

Your email address will not be published. Required fields are marked *