Melanjutkan dari modul sebelumnya mengenai error handling, disini kita akan menggunakan pendekatan subject. Pendekatan ini cocok jika error handling tersebut akan digunakan juga oleh component lainnya.
Kita akan gunakan pendekatan subject untuk post method. Buka file post.service.ts.
Lihat code dengan bagian commentar.
import { HttpClient } from "@angular/common/http";
import { Injectable } from "@angular/core";
import { map } from 'rxjs/operators';
//import library Subject jika IDE tidak otomatis.
import { Subject } from "rxjs";
import { Post } from "./post.model";
@Injectable({providedIn: "root"})
export class PostService{
//error handling menggunakan subject
error = new Subject<string>();
constructor(private http: HttpClient){}
createPost(title: string, content: string){
const postData: Post = {title: title, content: content}
this.http
.post<{ name: string }>('https://angular03-f9c9b-default-rtdb.firebaseio.com/posts.json', postData)
.subscribe(
responseData =>{
console.log(responseData);
}, error =>{ //error handling menggunakan subject
this.error.next(error.message);
}
);
}
fetchPosts(){
return this.http
.get<{ [key: string]: Post }>('https://angular03-f9c9b-default-rtdb.firebaseio.com/posts.json')
.pipe( map (responseData =>{
const postArr : Post[] = [];
for (const key in responseData){
if (responseData.hasOwnProperty(key)){
postArr.push({...responseData[key], id: key});
}
}
return postArr;
}));
}
deletePosts(){
return this.http.delete('https://angular03-f9c9b-default-rtdb.firebaseio.com/posts.json');
}
}
Kemudian buka file app.component.ts, tambahkan code untuk subscribe terhadap subject yang telah kita buat diatas. Jangan lupa untuk melakukan proses unsubscribe pada method onDestroy().
Lihat bagian code dengan commentar.
//tambahkan onDestroy jika IDE tidak otomatis
import { Component, OnDestroy, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
//tambahkan library Subscription jika IDE tidak otomatis
import { Subscription } from 'rxjs';
import { Post } from './post.model';
import { PostService } from './post.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
//tambahkan onDestroy
export class AppComponent implements OnInit, OnDestroy {
loadedPosts: Post[] = [];
isFetching = false;
_error = null;
//tambahkan subscription untuk handling post error
createPostErr : Subscription;
constructor(private http: HttpClient, private postSrv : PostService) {}
ngOnInit() {
//subscribe subject
this.createPostErr = this.postSrv.error.subscribe(errMsg =>{
this._error = errMsg;
console.log(this._error);
});
this.fetchPosts();
}
//implement onDestroy untuk unsubscribe
ngOnDestroy(): void {
this.createPostErr.unsubscribe();
}
onCreatePost(postData: Post) {
this.postSrv.createPost(postData.title, postData.content);
}
onFetchPosts() {
this.fetchPosts();
}
onClearPosts() {
this.postSrv.deletePosts().subscribe(()=>{
this.loadedPosts=[];
});
}
private fetchPosts(){
this.isFetching = true;
this.postSrv.fetchPosts().subscribe(
posts =>{
this.isFetching = false;
this.loadedPosts = posts;
},
//tambahkan error checking
error => {
this._error = error.message;
}
);
}
}
Ubah authorization pada Firebase, ubah write menjadi false. Lalu test lakukan posting data.
Sesuai ekspektasi error akan terjadi dan sudah berhasil kita handling.
