- Subject is a special type of Observable
- A Subject is a observer as well as observer.
- As subject involves taking a notification from a single source and forwarding them to one or more destinations.
- And this subject is usually placed in a service so if there are 5 component subscribed to this subject then all receives this message
interaction.service.ts
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class InteractionService {
private _teacherMessageSource = new Subject<String>();
teacherMessageSource$ = this._teacherMessageSource.asObservable();
constructor() { }
sendMessgae(message: string){
this._teacherMessageSource.next(message);
}
}
app.component.html
<h1>Teacher</h1> <button (click)="greetStudent()">Greet Student</button> <button (click)="appreciateStudent()">Apprceate Student</button> <app-child></app-child>
app.component.ts
import { InteractionService } from './interaction.service';
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent {
title = 'SubjectAsService';
constructor(private _interationService: InteractionService) {}
greetStudent(){
this._interationService.sendMessgae('Good Morning');
}
appreciateStudent(){
this._interationService.sendMessgae('Well Done');
}
}
child.component.html
<h2>Student</h2>
child.component.ts
import { InteractionService } from './../interaction.service';
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-child',
templateUrl: './child.component.html',
styleUrls: ['./child.component.css']
})
export class ChildComponent implements OnInit {
constructor(private _interactionService: InteractionService) { }
ngOnInit() {
this._interactionService.teacherMessageSource$
.subscribe(
(message) => {
if(message === 'Good Morning'){
alert('Good Morning teacher');
} else if(message === 'Well Done'){
alert('Thank you teacher');
}
}
);
}
}
