Monday, October 11, 2021

Subject in Angular

 What is a Subject?

Subject is a special type of Observable in RxJs Library in which we can send our data to other components or services. A Subject is like an Observable but can multicast to many observers which means subject is at the same time an Observable and an Observer.

To understand the subject we take the below example. In this example, we display user name and its status on home component and on click of user name we display user info in user component.


Step 1 : Create user.model.ts

export class User{
    userName : string = '';
    userStatus : string = '';
    constructor(userName : string , userStatus : string){
        this.userName = userName;
        this.userStatus = userStatus;
    }
}

Step 2 : Create user.service.ts

selectedUserEmitter : Subject that send User type into another component

userList : default user list

import { EventEmitter, Injectable } from "@angular/core";
import { Subject } from "rxjs";
import { User } from "../model/user.model";
@Injectable({
    providedIn: 'root'
})
export class UserService {
    selectedUserEmitter = new Subject<User>();
    userList: User[] = [{ userName: 'Mark', userStatus: 'Active' },
    { userName: 'Cris', userStatus: 'Inactive' }];

    getUserList(): User[] {
        return this.userList.slice();
    }
}

Step 3 : generate home and user component

ng g c home

ng g c user

Step 4 : home.component.html 

<div class="row" *ngFor="let user of this.userList">
    <div class="span6">
        <a (click)="onClick(user)"> <label for="UserName">User Name</label> {{user.userName}} </a>
    </div>
    <div class="span6">
        <a (click)="onClick(user)"> <label for="Status">Status</label> {{user.userStatus}} </a>
    </div>
    <hr />

</div>

home.component.ts

export class HomeComponent implements OnInit, OnDestroy {
  userList : User[] = [];
  constructor(private userService: UserService) { }
  ngOnDestroy(): void {
    this.userService.activatedEmitter.unsubscribe();
  }

  ngOnInit(): void {
  this.userList = this.userService.getUserList();
  }

  onClick(user : User){
    this.userService.selectedUserEmitter.next(user);
  }
}


Step 4 : user.component.html

<div class="col-xs-12 col-sm-10 col-md-8 col-sm-offset-1 col-md-offset-2">
    <p>{{this.selectedUserName}}</p>
    <p>{{this.selectedUserStatus}}</p>
</div>

user.component.ts

export class UserComponent implements OnInit,OnDestroy {
  selectedUserName : string = '';
  selectedUserStatus : string = '';
  constructor(private userService: UserService) { }
  ngOnDestroy(): void {
    this.userService.selectedUserEmitter.unsubscribe();
  }

  ngOnInit(): void {
    this.userService.selectedUserEmitter.subscribe(item => {
      this.selectedUserName = item.userName;
      this.selectedUserStatus = item.userStatus;
    });
  }
}

Step 5 : app.component.html

<div class="container">
  <div class="row">
    <div class="col-xs-12 col-sm-10 col-md-8 col-sm-offset-1 col-md-offset-2">
      <div class="panel panel-default">
        <div class="panel panel-heading">
          Details
        </div>
        <div class="panel panel-body">
          <app-home></app-home>
        </div>
      </div>
    </div>
  </div>
  <div class="row">
    <app-user></app-user>
  </div>
</div>


No comments:

Post a Comment