![]() |
| An Angular sample application to display a list of books. |
Table of Contents
Prerequisites
Before we start, you should have the following tools installed:
Create a New Angular Project
Open your terminal and run the following command to create a new Angular project:
ng new bookstoreThis command generates a new Angular project with the name "bookstore".
Create a Book Model
To represent books in our application, we will create a book model. In your terminal, navigate to the project directory and run the following command to create a new book model:
ng generate interface models/bookThis command generates a new TypeScript interface for our Book model in the src/app/models directory.
Open src/app/models/book.ts and add the following properties to the interface:
export interface Book {
id: number;
title: string;
author: string;
description: string;
imgUrl?: string;
}Create a Book Service
To fetch and save books, we will create a book service. In your terminal, run the following command to create a new book service:
ng generate service services/bookThis command generates a new TypeScript service for our Book service in the src/app/services directory.
Open src/app/services/book.service.ts and update the class with the following methods:
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
import { Book } from '../models/book';
@Injectable({
providedIn: 'root'
})
export class BookService {
private books: Book[] = [
{
id: 1,
title: 'Angular Tutorial',
author: 'John Smith',
description: 'A beginner\'s tutorial on Angular',
imgUrl: '/assets/images/angular-tutorial.png'
},
{
id: 2,
title: 'Angular Services',
author: 'Jane Doe',
description: 'Learn how to use services in Angular',
imgUrl: '/assets/images/angular-services.png'
}
];
getBooks(): Observable<Book[]> {
return of(this.books);
}
addBook(book: Book): void {
this.books.push(book);
}
}
The books property is an array of books that will be used to display the list of books in our UI. The getBooks method returns the array of books as an Observable. The addBook method adds a new book to the array.
Create a Book Component
To display the list of books and add new books to the list, we will create a book component. In your terminal, run the following command to create a new book component:
ng generate component components/bookThis command generates a new TypeScript component for our Book component in the src/app/components directory.
Open src/app/components/book.component.ts and add the following code:
import { Component, OnInit } from '@angular/core';
import { Book } from '../models/book';
import { BookService } from '../services/book.service';
@Component({
selector: 'app-book',
templateUrl: './book.component.html',
styleUrls: ['./book.component.css']
})
export class BookComponent implements OnInit {
books: Book[] = [];
newBook: Book = {} as Book;
error: string = '';
constructor(private bookService: BookService) {}
ngOnInit(): void {
this.getBooks();
}
getBooks(): void {
this.bookService.getBooks()
.subscribe(
books => this.books = books,
error => this.error = error
);
}
addBook(): void {
if (this.newBook.title.trim() && this.newBook.author.trim()) {
this.newBook.id = this.books.length + 1;
this.bookService.addBook(this.newBook);
this.newBook = {} as Book;
this.error = '';
} else {
this.error = 'Please provide book title and author';
}
}
}
The books property is an array of books that will be populated by the getBooks method. The newBook property represents the new book that will be added to the list. The error property is used to display any validation errors when adding a book.
The getBooks method calls the bookService.getBooks() method to populate the books array. The addBook method checks the validity of the provided book title and author, assigns a new id to the book, and adds it to the books array.
Create a Book UI Component
To render the list of books and the form to add a new book, we will create a book UI component. Open src/app/components/book.component.html and add the following HTML:
<div class="book-list">
<h2>Book List</h2>
<div *ngIf="error" class="error">{{ error }}</div>
<div *ngIf="!books.length && !error" class="no-books">No books available</div>
<div *ngFor="let book of books" class="book">
<div>
<img [src]="book.imgUrl" alt="book cover">
</div>
<div>
<h3>{{ book.title }}</h3>
<p>Author: {{ book.author }}</p>
<p>Description: {{ book.description }}</p>
</div>
</div>
</div>
<div class="book-form">
<h2>Add Book</h2>
<form>
<div>
<label for="title">Title:</label>
<input type="text" id="title" [(ngModel)]="newBook.title">
</div>
<div>
<label for="author">Author:</label>
<input type="text" id="author" [(ngModel)]="newBook.author">
</div>
<div>
<label for="description">Description:</label>
<textarea id="description" [(ngModel)]="newBook.description"></textarea>
</div>
<div>
<label for="imgUrl">Image URL:</label>
<input type="text" id="imgUrl" [(ngModel)]="newBook.imgUrl">
</div>
<div>
<button type="button" (click)="addBook()">Add Book</button>
</div>
</form>
</div>
This HTML template displays the list of books as well as a form to add new books. It uses Angular's built-in structural directives - *ngIf and *ngFor - to conditionally render the UI elements.
Update the App Component
Finally, we need to update the app component to add the book component to our application. Open src/app/app.component.html and add the following HTML:
<app-book></app-book>This code will render our BookComponent in the main view of the application.
Conclusion
You have built a simple Angular application to display a list of books with the ability to add new books to the list. You also learned how to create a data model, service, and UI components in Angular. As you continue to develop your Angular skills, you can build more complex applications using more advanced concepts such as routing, forms, and observables. The sky is the limit with Angular!
.png)