Learn Angular in Easy Steps Book PDF
Learn Angular in Easy Steps Book PDF
Ahmed Bouchefra
This book is for sale at http://leanpub.com/learnangular8ineasysteps
This is a Leanpub book. Leanpub empowers authors and publishers with the Lean Publishing
process. Lean Publishing is the act of publishing an in-progress ebook using lightweight tools and
many iterations to get reader feedback, pivot until you have the right book and build traction once
you do.
Contents
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps
In this book, we’ll learn Angular in 15 easy steps by building an example web application that
consumes a REST API.
The REST API will be mocked using json-server¹ which allows you to create a fully-working API
based on a JSON file that contains sample data.
Introduction
More often than not, modern web development involves multiple developers working in separate
front-end and back-end applications. This approach has many advantages, such as the separation of
concerns but also introduces a few challenges such as the difficulties in coordination between the
front-end and back-end developers. Here comes the role of tools such as JSON-Server to ease these
difficulties.
Most of the times when we hear about mocking, we think of unit testing where we need to mock
an object instance before we’ll be able test it. But actually we can do more with mocking beyond
testing.
In this book, we’ll show you how you can increase your development speed and quality by mocking.
your backend.
• The backend developers prepare the stubs and simply return some hard-coded data. This still
requires some time before the frontend developers can start working on the app.
• The frontend developers create and use hardcoded data which becomes messy fast.
¹https://github.com/typicode/json-server
Learn Angular 8 in 15 Easy Steps 2
Both approaches have many disadvantages but luckily for Angular developers, there is another way
which involves using json-server to mock a fully-working REST API in no time with nearly zero-
lines of code in most scenarios.
As a front-end developer, JSON-Server is such a great tool that allows you to spin up a REST API
server with a fully-working API with zero coding.
In this book, we’ll show you how to use JSON-Server to simulate a REST API with literally zero
lines of code.
As far as Angular is concerned, there is no real difference between consuming a real and fake REST
API. This will allow you to start developing your front-end application even when the back-end is
not ready yet.
Angular 8 was released on May 28, 2019, and comes with various features and improvements to the
Angular CLI and the framework. We now have small bundles and new APIs to hook into the ng add
and ng build commands of the CLI but also a new ng deploy command. This book is now updated
to the latest Angular 8.3 version. We’ll see how to use the new ng deploy feature in Angular 8.3+ to
easily deploy your Angular application from the command-line to Firebase hosting.
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 3
Prerequisites
Before getting started you need a few prerequisites:
• Basic knowledge of TypeScript. Particularly the familiarity with Object Oriented concepts such
as TypeScript classes and decorators.
• A local development machine with Node 8.9+, together with NPM 5.5.1+ installed. Node is
required by the Angular CLI like the most frontend tools nowadays. You can simply go to the
downloads page of the official website² and download the binaries for your operating system.
You can also refer to your specific system instructions for how to install Node using a package
manager. The recommended way though is using NVM³ - Node Version Manager - a POSIX-
compliant bash script to manage multiple active Node.js versions.
Note: If you don’t want to install a local environment for Angular development but still
want to try the code in this book, you can use Stackblitz⁴, an online IDE for frontend
development that you can use to create an Angular project compatible with Angular CLI.
If you have the previous prerequisites, you are ready for the next steps of our book that will teach you
by example how to use Angular HttpClient to send HTTP GET requests for fetching JSON data and
the various RxJS operators such as catchError(), tap(), retry(), and takeUntil() for implementing
advanced features such as error handling, retrying failed HTTP requests and cancelling pending
requests. In the first step(s) of our book, we’ll see how to install Angular CLI 8 and create an example
project from scratch.
²https://nodejs.org/downloads
³https://github.com/nvm-sh/nvm
⁴https://stackblitz.com/
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 4
Angular CLI
Angular CLI⁵ is the official tool for initializing and working with Angular projects. To install it, open
a new command-line interface and run the following command:
At the time of writing this book, angular/cli v8.3.2 will be installed on your system. In the next
step, we’ll learn how to intialize a new example project from the command-line.
⁵https://cli.angular.io/
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 5
1 $ cd ~
2 $ ng new ngstore
The CLI will ask you a couple of questions - If Would you like to add Angular routing? Type y for
Yes and Which stylesheet format would you like to use? Choose CSS. This will instruct the CLI to
automatically set up routing in our project so we’ll only need to add the routes for our components
to implement navigation in our application. Next, navigate to you project’s folder and run the local
development server using the following commands:
1 $ cd ngstore
2 $ ng serve
Open your web browser and navigate to the http://localhost:4200/ address to see your app up
and running. This is a screenshot at this point:
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 6
Angular 8 Project
You should now leave the development server running and start a new command-line interface for
running the CLI commands of the next steps.
In the next step, we’ll learn how to create a fake JSON REST API that we’ll be consuming in our
Angular example application.
1 $ cd ~/ngstore
2 $ npm install - save json-server
Next, create a server folder in the root folder of your Angular project:
⁶https://www.techiediaries.com/angular-tutorial-example-rest-api-httpclient-get-ngfor
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 7
1 $ mkdir server
2 $ cd server
In the server folder, create a database.json file and add the following JSON object:
1 {
2 "products": []
3 }
This JSON file will act as a database for your REST API server. You can simply add some data to be
served by your REST API or use Faker.js⁷ for automatically generating massive amounts of realistic
fake data.
Go back to your command-line, navigate back from the server folder, and install Faker.js from
npm using the following command:
1 $ cd ..
2 $ npm install faker - save
At the time of creating this example, faker v4.1.0 will be installed. Now, create a generate.js file
and add the following code:
We first imported faker, next we defined an object with one empty array for products. Next, we
entered a for loop to create 300 fake entries using faker methods like faker.commerce.productName()
for generating product names. Check all the available methods⁸. Finally we converted the database
object to a string and log it to standard output.
Next, add the generate and server scripts to the package.json file:
⁷https://github.com/marak/Faker.js/
⁸https://github.com/marak/Faker.js/#api-methods
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 8
1 "scripts": {
2 "ng": "ng",
3 "start": "ng serve",
4 "build": "ng build",
5 "test": "ng test",
6 "lint": "ng lint",
7 "e2e": "ng e2e",
8 "generate": "node ./server/generate.js > ./server/database.json",
9 "server": "json-server - watch ./server/database.json"
10 },
Next, head back to your command-line interface and run the generate script using the following
command:
Finally, run the REST API server by executing the following command:
You can now send HTTP requests to the server just like any typical REST API server. Your server
will be available from the http://localhost:3000/ address.
These are the API endpoints we’ll be able to use via our JSON REST API server:
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 9
You can use _page and _limit parameters to get paginated data. In the Link header you’ll get first,
prev, next and last links.
For example:
GET /products?_page=1 for getting the first page of data, GET /products?_page=1&_limit=5 for
getting the first five products of the first page of data.
Note: You can use other features such as filters, sorting and ordering. For more informa-
tion, check out the docs⁹.
Leave the JSON REST API server running and open a new command-line interface for typing the
commands of the next steps.
As a summary of what we have done - We installed Angular CLI and initialized a new project based
on the latest Angular 8 version. Then, we created a REST API using json-server based on a JSON
file. In the next step of our book, we’ll learn how to set up HttpClient in our Angular 8 project.
⁹https://github.com/typicode/json-server
¹⁰https://code.visualstudio.com
¹¹https://angular.io/api/common/http/HttpClientModule#description
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 10
That’s all, we are now ready to use the HttpClient service in our project but before that we need to
create a couple of components - The home and about components. This is what we’ll learn to do in
the next step.
1 $ cd ~/ngstore
2 $ ng generate component home
Next, let’s create the about component using the following command:
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 11
We’ll update the home component in the following steps. In the next step of our book, we’ll add
these components to the router.
We first imported the home and about components, next we added three routes including a route
for redirecting the empty path to the home component, so when the user visits the app, they will be
redirected to the home page.
In the next step of our example, we’ll set up Angular Material in our project for styling our UI.
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 12
1 $ ng add @angular/material
You’ll be asked for choosing a theme, choose Indigo/Pink. For the other options - Set up HammerJS
for gesture recognition? and Set up browser animations for Angular Material? Simply press
Enter in your keyboard to choose the default answers.
Next, open the src/styles.css file and add a theme:
1 @import "~@angular/material/prebuilt-themes/indigo-pink.css";
Each Angular Material component has a separate module that you need to import before you can
use the component. Open the src/app/app.module.ts file and add the following imports:
1 import { MatToolbarModule,
2 MatIconModule,
3 MatCardModule,
4 MatButtonModule,
5 MatProgressSpinnerModule } from '@angular/material';
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 13
1 @NgModule({
2 declarations: [
3 AppComponent,
4 HomeComponent,
5 AboutComponent
6 ],
7 imports: [
8 BrowserModule,
9 AppRoutingModule,
10 HttpClientModule,
11 BrowserAnimationsModule,
12 MatToolbarModule,
13 MatIconModule,
14 MatButtonModule,
15 MatCardModule,
16 MatProgressSpinnerModule
17 ],
18 providers: [],
19 bootstrap: [AppComponent]
20 })
21 export class AppModule { }
1 <mat-toolbar color="primary">
2 <h1>
3 ngStore
4 </h1>
5 <button mat-button routerLink="/">Home</button>
6 <button mat-button routerLink="/about">About</button>
7 </mat-toolbar>
8 <router-outlet></router-outlet>
We created the shell of our application containing a top bar with two navigation buttons to the home
and about components.
As a summary of what we did until this point of our book - We have setup HttpClient and Angular
Material in our project, created the home and about components and configured routing, and finaly
added the shell of our application containing a topbar with navigation. In the next step of our book,
we’ll learn how to fetch the JSON data from our REST API server using HttpClient.
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 14
• HttpClient makes it easy to send and process HTTP requests and responses,
• HttpClient has many builtin features for implementing test units,
• HttpClient makes use of RxJS Observables for handling asynchronous operations instead of
Now after introducing HttpClient, let’s proceed to building our example application starting with
the prerequisites needed to successfully complete the tutorial.
We’ll need to create an Angular service for encapsulating the code that deals with consuming data
from the REST API server.
A service is a singleton that can be injected by other services and components using the Angular
dependency injection.
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 15
Next, open the src/app/data.service.ts file, import and inject HttpClient as follows:
We imported and injected the HttpClient service as a private httpClient instance. We also
defined the REST_API_SERVER variable that holds the address of our REST API server. Next, add
a sendGetRequest() method that sends a GET request to the REST API endpoint to retrieve JSON
data:
The method simply invokes the get() method of HttpClient to send GET requests to the REST API
server.
Next, we now need to use this service in our home component. Open the src/app/home/home.component.ts
file, import and inject the data service as follows:
¹⁷https://en.wikipedia.org/wiki/Dependency_injection
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 16
We imported and injected DataService as a private dataService instance via the component
constructor.
Next, we defined a products variable and called the sendGetRequest() method of the service for
fetching data from the JSON REST API server. Since the sendGetRequest() method returns the
return value of the HttpClient.get() method which is an RxJS Observable, we subscribed to the
returned Observable to actually send the HTTP GET request and process the HTTP response. When
data is received, we added it in the products array.
Next, open the src/app/home/home.component.html file and update it as follows:
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 17
We used the <mat-spinner> component for showing a loading spinner when the length of the
products array equals zero i.e before no data is received from the REST API server. Next, we iterated
over the products array and used a Material card to display the name, price, quantity, description
and image of each product. This is a screenshot of the home page after JSON data is fetched:
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 18
Angular 8 Example
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 19
In this step, we’ll proceed to add error handling in our example application.
The Angular’s HttpClient methods can be easily used with the catchError() operator from RxJS,
since they return Observables, via the pipe() method for catching and handling errors. We simply
need to define a method to handle errors within your service.
There are two types of errors in front-end applications:
• Client-side errors such as network issues and JavaScript syntax and type errors. These errors
return ErrorEvent objects.
• Server-side errors such as code errors in the server and database access errors. These errors
return HTTP Error Responses.
As such, we simply need to check if an error is an instance of ErrorEvent to get the type of the error
so we can handle it appropriately.
Now, let’s see this by example. Open the src/app/data.service.ts file and update it accordingly:
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 20
23 }
24
25 public sendGetRequest(){
26 return this.httpClient.get(this.REST_API_SERVER).pipe(catchError(this.handleError));
27 }
28 }
As you can see, this needs to be done for each service in your application which is fine for our
example since it only contains one service but once your application starts growing with many
services which may all throw errors you need to use better solutions instead of using the handleError
method per each service which is error-prone. One solution is to handle errors globally in your
Angular application using HttpClient interceptors¹⁸.
This is a screenshot of an error on the console if the server is unreachable:
In the next step, we’ll see how to improve our data service by automatically retry sending the failed
HTTP requests.
¹⁸https://angular.io/guide/http#http-interceptors
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 21
In this step of our book, we’ll see how to use the retry() operator of RxJS with HttpClient to
automatically resubscribing to the returned Observable which results in resending the failed HTTP
requests.
In many cases, errors are temporary and due to poor network conditions so simply trying again
will make them go away automatically. For example, in mobile devices network interruptions are
frequent so if the user tries again, they may get a successful response. Instead of letting users
manually retry, let’s see how to do that automatically in our example application.
The RxJS library provides several retry operators. Among them is the retry() operator which allows
you to automatically re-subscribe to an RxJS Observable a specified number of times. Re-subscribing
to the Observable returned from an HttpClient method has the effect of resending the HTTP request
to the server so users don’t need to repeat the operation or reload the application.
You can use the RxJS retry() operator by piping it (using the pipe() method) onto the Observable
returned from the HttpClient method before the error handler.
Go to the src/app/data.service.ts file and import the retry() operator:
1 public sendGetRequest(){
2 return this.httpClient.get(this.REST_API_SERVER).pipe(retry(3), catchError(this.han\
3 dleError));
4 }
This will retry sending the failed HTTP request three times.
In the next step, we’ll see how to unsubscribe from RxJS Observables in our example home
component.
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 22
components to avoid memory leaks but in the case of HttpClient, this is automatically handled by
Angular by unsubscribing when the HTTP response is received. However, there are some cases when
you need to manually unsubscribe for example to cancel pending requests when users are about to
leave the component.
We can simply call the unsubscribe() method from the Subscription object returned by the
subscribe() method in the ngOnDestroy() life-cycle method of the component to unsubscribe from
the Observable.
There is also a better way to unsubscribe from or complete Observables by using the takeUntil()
operator.
The takeUntil()¹⁹ operator emits the values emitted by the source Observable until a notifier
Observable emits a value.
Let’s see how to use this operator to complete Observables when the component is destroyed.
Open the src/app/home/home.component.ts file and update it as follows:
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 23
We first imported the OnDestroy interface, Subject and the takeUntil() operator. Next, we
implemented the OnDestroy interface and added the ngOnDestroy() lifecycle hook to the component.
Next, we created an instance of Subject which can emit boolean values (the type of the value doesn’t
really matter in this example) that will be used as the notifier of the takeUntil() operator.
Next, in the ngOnInit() lifecycle hook, we called the sendGetRequest() of our data service and
called the pipe() method of the returned Observable to pipe the takeUnitl() operator and finaly
subscribed to the combined Observable. In the body of the subscribe() method, we added the logic
to put the fetched data of the HTTP response in the products array. The takeUntil() operator allows
a notified Observable to emit values until a value is emitted from a notifier Observable.
When Angular destroys a component it calls the ngOnDestroy() lifecycle method which, in our case,
calls the next() method to emit a value so RxJS completes all subscribed Observables. That’s it. In
this step, we have added the logic to cancel any pending HTTP request by unsubscribing from the
returned Observable in case the user descides to navigate away from the component before the
HTTP response is received.
In the next step of our book, we’ll see how to use URL query parameters with the get() method of
HttpClient.
Next, update the sendGetRequest() method as follows: ts public sendGetRequest(){ // Add safe,
URL encoded_page parameter const options = { params: new HttpParams({fromString: "_-
page=1&_limit=20"}) }; return this.httpClient.get(this.REST_API_SERVER, options).pipe(retry(3),
catchError(this.handleError)); }
We used HttpParams and fromString to create HTTP query parameters from the _page=1&_limit=20
string. This tells to returns the first page of 20 products.
Now the sendGetRequest() will be used to retrieve the first page of data. The received HTTP
response will contain a Link header with information about the first, previous, next and last links
of data pages.
²⁰https://angular.io/guide/http#use-fromstring-to-create-httpparams
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 24
In the Link header you’ll get first, prev, next and last links. In the next step, we’ll see how to extract
these pagination links by parsing full HTTP responses.
The Link header in HTTP allows the server to point an interested client to another
resource containing metadata about the requested resource.Wikipedia²²
Next, define the parseLinkHeader() method which parses the Link header and populate the previous
variables accordingly:
²¹https://angular.io/api/common/http/HttpResponse
²²https://www.w3.org/wiki/LinkHeader
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 25
1 parseLinkHeader(header) {
2 if (header.length == 0) {
3 return ;
4 }
5 let parts = header.split(',');
6 var links = {};
7 parts.forEach( p => {
8 let section = p.split(';');
9 var url = section[0].replace(/<(.*)>/, '$1').trim();
10 var name = section[1].replace(/rel="(.*)"/, '$1').trim();
11 links[name] = url;
12 });
13
14 this.first = links["first"];
15 this.last = links["last"];
16 this.prev = links["prev"];
17 this.next = links["next"];
18 }
1 public sendGetRequest(){
2 // Add safe, URL encoded _page and _limit parameters
3
4 return this.httpClient.get(this.REST_API_SERVER, { params: new HttpParams({fromStri\
5 ng: "_page=1&_limit=20"}), observe: "response"}).pipe(retry(3), catchError(this.hand\
6 leError), tap(res => {
7 console.log(res.headers.get('Link'));
8 this.parseLinkHeader(res.headers.get('Link'));
9 }));
10 }
We added the observe option with the response value in the options parameter of the get() method
so we can have the full HTTP response with headers. Next, we use the RxJS tap() operator for
parsing the Link header before returning the final Observable.
Since the sendGetRequest() is now returning an Observable with a full HTTP response, we need
to update the home component so open the src/app/home/home.component.ts file and import
HttpResponse as follows:
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 26
1 ngOnInit() {
2 this.dataService.sendGetRequest().pipe(takeUntil(this.destroy$)).subscribe((res: Htt\
3 pResponse<any>)=>{
4 console.log(res);
5 this.products = res.body;
6 })
7 }
We can now access the data from the body object of the received HTTP response. Next, go back to
the src/app/data.service.ts file and add the following method:
This method is similar to sendGetRequest() except that it takes the URL to which we need to send
an HTTP GET request.
Go back to the src/app/home/home.component.ts file and add define the following methods:
1 public firstPage() {
2 this.products = [];
3 this.dataService.sendGetRequestToUrl(this.dataService.first).pipe(takeUntil(this.de\
4 stroy$)).subscribe((res: HttpResponse<any>) => {
5 console.log(res);
6 this.products = res.body;
7 })
8 }
9 public previousPage() {
10 if (this.dataService.prev !== undefined && this.dataService.prev !== '') {
11 this.products = [];
12 this.dataService.sendGetRequestToUrl(this.dataService.prev).pipe(takeUntil(this.des\
13 troy$)).subscribe((res: HttpResponse<any>) => {
14 console.log(res);
15 this.products = res.body;
16 })
17 }
18 }
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 27
19 public nextPage() {
20 if (this.dataService.next !== undefined && this.dataService.next !== '') {
21 this.products = [];
22 this.dataService.sendGetRequestToUrl(this.dataService.next).pipe(takeUntil(this.des\
23 troy$)).subscribe((res: HttpResponse<any>) => {
24 console.log(res);
25 this.products = res.body;
26 })
27 }
28 }
29 public lastPage() {
30 this.products = [];
31 this.dataService.sendGetRequestToUrl(this.dataService.last).pipe(takeUntil(this.des\
32 troy$)).subscribe((res: HttpResponse<any>) => {
33 console.log(res);
34 this.products = res.body;
35 })
36 }
Finally, add open the src/app/home/home.component.html file and update the template as follows:
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 28
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 29
Next, specify the Product interface as the HttpClient.get() call’s type parameter in the data service.
Go back to the src/app/data.service.ts file and import the Product interface:
Next:
1 public sendGetRequest(){
2 return this.httpClient.get<Product[]>(this.REST_API_SERVER, { params: new HttpParams\
3 ({fromString: "_page=1&_limit=20"}), observe: "response"}).pipe(retry(3), catchError\
4 (this.handleError), tap(res => {
5 console.log(res.headers.get('Link'));
6 this.parseLinkHeader(res.headers.get('Link'));
7
8 }));
9 }
10 public sendGetRequestToUrl(url: string){
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 30
Next, open the src/app/home/home.component.ts file and import the Product interface:
Next chnage the type of the HTTP response in the sendGetRequest() call:
1 ngOnInit() {
2 this.dataService.sendGetRequest().pipe(takeUntil(this.destroy$)).subscribe((res: Htt\
3 pResponse<Product[]>) => {
4 console.log(res);
5 this.products = res.body;
6 })
7 }
You also need to do the same for the other firstPage(), previousPage(), nextPage() and lastPage()
methods.
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 31
After adding a deployment package it will automatically update your workspace configuration (i.e
the angular.json file) with a deploy section for the selected project. You can then use the ng deploy
command to deploy that project.
Let’s now see that by example by deploying our project to Firebase hosting.
Head back to your command-line interface, make sure you are inside the root folder of your Angular
project and run the following command:
1 $ ng add @angular/fire
1 "deploy": {
2 "builder": "@angular/fire:deploy",
3 "options": {}
4 }
The CLI will prompt you to Paste authorization code here: and will open your default web browser
and ask you to give Firebase CLI permissions to administer your Firebase account:
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 32
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 33
After you signin with the Google account associated with your Firebase account, you’ll be given the
authorization code:
Next, you’ll be prompted: Please select a project: (Use arrow keys or type to search). You should
have created a Firebase project before.
The CLI will create the firebase.json and .firebaserc files and update the angular.json file
accordingly.
Next, deploy your application to Firebase, using the following command:
A book by https://techiediaries.com
Learn Angular 8 in 15 Easy Steps 34
1 $ ng deploy
The command will produce an optimized build of your application (equivalent to the ng deploy - prod
command), it will upload the production assets to Firebase hosting.
Conclusion
Throughout this book, we’ve built a complete working Angular application example using the latest
Angular 8.3+ version.
You learned to mock a REST API backend for your Angular application with nearly zero-lines of
code.
You learned to create a project using Angular CLI, add HttpClient and Angular Material for
sending HTTP requests to your mocked REST API backend and styling the UI with Material Design
components.
You have particularly seen how send HTTP GET requests with parameters using the get() method,
how to handle HTTP errors using the RxJS throwError() and catchError() operators, unsubscribe
from RxJS Observables for the cancelled HTTP requests using the takeUntil() operator and retry
failed requests with the retry() operator.
Finally, you learned to deploy your Angular application to Firebase using the ng deploy command
available starting from Angular 8.3+.
A book by https://techiediaries.com