Tuesday, August 10, 2021

Communication between components using data service in angular

 We can establish communication between components using data service. To understand this concept  lets take below example. Here we can add user with there status and display users in active/inactive list. we can also change the status of any existing user.


Lets start to build our example.

Step 1 : Create user.model.ts

export class User{
    status string;
    user : string;
    constructor(user : string , status : string){
        this.user = user;
        this.status = status;
    }
}

Step 2 : Generate components

ng g c create-user

ng g c active-user

ng g c inactive-user

Step 3 : create-user.comopnent.ts

import { ComponentOnInitfrom '@angular/core';
import { AccountService } from '../services/account.service';
import { User } from '../shared/user.model';

@Component({
  selector: 'app-create-user',
  templateUrl: './create-user.component.html',
  styleUrls: ['./create-user.component.css']
})
export class CreateUserComponent implements OnInit {
  userNamestring = '';
  statusstring = '';
  constructor(private accountServiceAccountService) { }

  ngOnInit(): void {
  }

  onAdd() {
    this.accountService.onAdd({ user: this.userNamestatus: this.status });
  }

  onRemove() {
    this.accountService.onRemove({ user: this.userNamestatus: this.status });
  }
}

Step 4 : create-user.component.html

<div class="container">
    <div class="row">
        <div class="col-xs-12">
            <label for="UserName">User Name</label>
            <input type="text" for="userName" [(ngModel)]="userName" class="form-control">
            <label for="Status">Status</label>
            <select class="form-control" for="status" [(ngModel)]="status">
                <option>Active</option>
                <option>Inactive</option>
            </select>
        </div>
        <div class="col-xs-5">
            <span class="span">
                <button type="button" class="btn btn-primary" 
                (click)="onAdd()">Add</button></span>
            <span><button type="button" class="btn btn-warning"
                    (click)="onRemove()">Remove</button></span>
        </div>
    </div>
</div>

Step 5 : Build active-user.component.ts

import { ComponentInputOnInitfrom '@angular/core';
import { AccountService } from '../services/account.service';

@Component({
  selector: 'app-active-user',
  templateUrl: './active-user.component.html',
  styleUrls: ['./active-user.component.css']
})
export class ActiveUserComponent implements OnInit {
  @Input()
  activeUser!: string;

  constructor(private accountService : AccountService) { }

  ngOnInit(): void {
  }

  onSetInActiveUser(userstring) {
    this.accountService.onSetInActiveUser(user);
  } 
}

Step 6 : active-user.component.html

<li class="list-group-item">
    {{activeUser}} |
    <a href="#" (click)="onSetInActiveUser(activeUser)">Set to Inactive</a>
</li>

Step 7 : inactive-user.component.ts

import { ComponentInputOnInit } from '@angular/core';
import { AccountService } from '../services/account.service';

@Component({
  selector: 'app-inactive-user',
  templateUrl: './inactive-user.component.html',
  styleUrls: ['./inactive-user.component.css']
})
export class InactiveUserComponent implements OnInit {
  @Input() inActiveUser !: string;
  constructor(private accountService : AccountService ) { }

  ngOnInit(): void {
  }

  onSetActiveUser(userstring) {
    this.accountService.onSetActiveUser(user);
  }
}

Step 7 : inactive-user.component.html

<li class="list-group-item">
    {{inActiveUser}} |
    <a href="#" (click)="onSetActiveUser(inActiveUser)">Set to Active</a>
</li>

Step 8 : account.service.ts

import { User } from "../shared/user.model";

export class AccountService {
  activeUserListstring[] = ['Max''Chris'];
  inActiveUserListstring[] = ['Rode''Chin'];

  onSetInActiveUser(userstring) {
    this.activeUserList = this.activeUserList.filter(ele => ele !== user);
    this.inActiveUserList.push(user);
  }

  onSetActiveUser(userstring) {
    this.inActiveUserList = this.inActiveUserList.filter(ele => ele !== user);
    this.activeUserList.push(user);
  }

  onAdd(itemUser) {
    if (item.status === 'Active'this.activeUserList.push(item.user);
    else this.inActiveUserList.push(item.user);
  }

  onRemove(itemUser) {
    if (item.status === 'Active'this.activeUserList = this.activeUserList.filter(e => e !== item.user);
    else this.inActiveUserList = this.inActiveUserList.filter(e => e !== item.user);
  }
}

Step 9 : app-component.ts

import { ComponentOnInit } from '@angular/core';
import { AccountService } from './services/account.service';
import { User } from './shared/user.model';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  title = 'ServiceAssignment';
  activeUserList : string[] = [];
  inActiveUserList : string[] = [];

  constructor(public accountServiceAccountService) { }

  ngOnInit(){
     this.activeUserList = this.accountService.activeUserList;
     this.inActiveUserList = this.accountService.inActiveUserList;
  }
}

Step 10 : app-component.html

<app-create-user></app-create-user> 
<div class="container">
    <hr />
    <label for="ActiveUsers">Active Users</label>
    <ul class="list-group">
        <app-active-user 
        *ngFor="let acu of this.accountService.activeUserList" 
        [activeUser]="acu"></app-active-user>
    </ul>
    <label for="InactiveUsers">Inactive Users</label>
    <ul class="list-group">
        <app-inactive-user 
        *ngFor="let incu of this.accountService.inActiveUserList" 
        [inActiveUser]="incu"></app-inactive-user>           
    </ul>
</div>



No comments:

Post a Comment