Published: December 01 2016
Last updated: June 25 2018

Angular 2/5 - Communicating Between Components with Observable & Subject

Tutorial built with Angular 5.2.11 and RxJS 5.5.11

Other versions available:

This is a quick post to show an example of something that got me stuck for a little while - how to communicate between components in Angular 2/5.

The solution is to use an Observable and a Subject (which is a type of observable), I won't go too much into the details about how observables work here, but in a nutshell there are two methods that we're interested in: Observable.subscribe() and Subject.next().

Observable.subscribe()

The observable subscribe method is used to subscribe to messages that are sent to an observable.

Subject.next()

The subject next method is used to send messages to an observable which are then sent to all subscribers of that observable.


Example of Component Communication in Angular 2/5

Here's a simple example showing a home component communicating with the root app component via a message service using observables.

The code is also available on GitHub at https://github.com/cornflourblue/angular2-communicating-between-components

(See on StackBlitz at https://stackblitz.com/edit/angular2-communicating-between-components)

Update History:

  • 25 Jun 2018 - Updated to Angular 5.2.11
  • 29 Nov 2017 - Updated to Angular 5.0.3
  • 23 May 2017 - Updated to Angular 4.1.3
  • 01 Dec 2016 - Built with Angular 2.2.1


Running the Angular 2/5 Component Communication Example Locally

  1. Install NodeJS (> v4) and NPM (> v3) from https://nodejs.org/en/download/, you can check the versions you have installed by running node -v and npm -v from the command line.
  2. Download the project source code from https://github.com/cornflourblue/angular2-communicating-between-components
  3. Install all required npm packages by running npm install from the command line in the project root folder (where the package.json is located).
  4. Start the application by running npm start from the command line in the project root folder.


Angular 2/5 Message Service

The message service enables subscribing to messages and sending messages from any component in the application.

IMPORTANT: If you add a service like this to your application don't forget to add it to the providers: [...] section of your app.module.ts file, see here for an example. Thanks J.G. Oliver for mentioning in the comments that this wasn't clear in the post.

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

@Injectable()
export class MessageService {
    private subject = new Subject<any>();

    sendMessage(message: string) {
        this.subject.next({ text: message });
    }

    clearMessage() {
        this.subject.next();
    }

    getMessage(): Observable<any> {
        return this.subject.asObservable();
    }
}


Angular 2/5 App Component that Receives Messages

The app component uses the message service to subscribe to new messages and make them available to the app component template via the message property.

import { Component, OnDestroy } from '@angular/core';
import { Subscription } from 'rxjs/Subscription';

import { MessageService } from './_services/index';

@Component({
    moduleId: module.id,
    selector: 'app',
    templateUrl: 'app.component.html'
})

export class AppComponent implements OnDestroy {
    message: any;
    subscription: Subscription;

    constructor(private messageService: MessageService) {
        // subscribe to home component messages
        this.subscription = this.messageService.getMessage().subscribe(message => { this.message = message; });
    }

    ngOnDestroy() {
        // unsubscribe to ensure no memory leaks
        this.subscription.unsubscribe();
    }
}


Angular 2/5 Home Component that Sends Messages

The home component uses the message service to send messages to the app component.

import { Component } from '@angular/core';

import { MessageService } from '../_services/index';

@Component({
    moduleId: module.id,
    templateUrl: 'home.component.html'
})

export class HomeComponent {
    constructor(private messageService: MessageService) {}
    
    sendMessage(): void {
        // send message to subscribers via observable subject
        this.messageService.sendMessage('Message from Home Component to App Component!');
    }

    clearMessage(): void {
        // clear message
        this.messageService.clearMessage();
    }
}

 


Need Some Angular 2 Help?

Search fiverr for freelance Angular 2 developers.


Follow me for updates

On Twitter or RSS.


When I'm not coding...

Me and Tina are on a motorcycle adventure around Australia.
Come along for the ride!


Comments


Supported by