Seperti yang sudah dipelajari dalam modul Observable, aplikasi dapat kita tingkatkan dengan mengubah eventEmitter menggunakan Observable.
Buka file shopping-list.service.ts, kita ganti code eventEmitter menggunakan Subject.
//diganti menggunakan subject
//import { EventEmitter } from "@angular/core";
import { Subject } from "rxjs";
import { Ingredient } from "../shared/ingredient.model";
export class ShoppingListService{
//diganti menggunakan subject
//newInggredientAdded = new EventEmitter<Ingredient[]>();
newInggredientAdded = new Subject<Ingredient[]>();
private ingredients : Ingredient[] = [
new Ingredient("Oreo", 1),
new Ingredient("Tepung", 1),
];
getIngredients(){
return this.ingredients.slice();
}
addIngredient(ingredient : Ingredient){
this.ingredients.push(ingredient);
//diganti menggunakan subject
this.newInggredientAdded.next(this.ingredients.slice());
}
addIngredients(ingredients: Ingredient[]){
this.ingredients.push(...ingredients);
//diganti menggunakan subject
this.newInggredientAdded.next(this.ingredients.slice());
}
}
Kemudian buka file shopping-list.component.ts, modifikasi dengan menambahkan
- Library import untuk subscription.
- Inisialisasi local variable untuk menyimpan data subscription.
- Lakukan proses unsubscribe ketika componen di destroy.
import { Component, OnDestroy, OnInit } from '@angular/core';
//import modul subscription (jika IDE tidak otomatis melakukan penambahan)
import { Subscription } from 'rxjs';
import { Ingredient } from '../shared/ingredient.model';
import { ShoppingListService } from './shopping-list.service';
@Component({
selector: 'app-shopping-list',
templateUrl: './shopping-list.component.html',
styleUrls: ['./shopping-list.component.css']
})
export class ShoppingListComponent implements OnInit, OnDestroy {
ingredients! : Ingredient[];
//local variable untuk menyimpan data subscription
private ingSub! : Subscription;
constructor(private shoppingListServ : ShoppingListService) { }
ngOnInit(): void {
this.ingredients = this.shoppingListServ.getIngredients();
//store subcription kedalam local variable
this.ingSub = this.shoppingListServ.newInggredientAdded.subscribe(
(ingredients: Ingredient[]) =>{this.ingredients = ingredients;}
);
}
//handling untuk unsubscribe subcription
ngOnDestroy(): void {
this.ingSub.unsubscribe()
}
}
Pastikan aplikasi berjalan dengan baik setelah dilakukan perubahan diatas.