@@ -11,4 +11,7 @@
|
|
11 |
}
|
12 |
ISBN: {{ b.isbn }}
|
13 |
</div>
|
|
|
|
|
|
|
14 |
</article>
|
|
|
11 |
}
|
12 |
ISBN: {{ b.isbn }}
|
13 |
</div>
|
14 |
+
<footer>
|
15 |
+
<button type="button" class="secondary" (click)="likeBook()">Like</button>
|
16 |
+
</footer>
|
17 |
</article>
|
@@ -1,4 +1,4 @@
|
|
1 |
-
import { Component, input } from '@angular/core';
|
2 |
|
3 |
import { Book } from '../../shared/book';
|
4 |
|
@@ -10,4 +10,9 @@ import { Book } from '../../shared/book';
|
|
10 |
})
|
11 |
export class BookItem {
|
12 |
readonly book = input.required<Book>();
|
|
|
|
|
|
|
|
|
|
|
13 |
}
|
|
|
1 |
+
import { Component, input, output } from '@angular/core';
|
2 |
|
3 |
import { Book } from '../../shared/book';
|
4 |
|
|
|
10 |
})
|
11 |
export class BookItem {
|
12 |
readonly book = input.required<Book>();
|
13 |
+
readonly like = output<Book>();
|
14 |
+
|
15 |
+
likeBook() {
|
16 |
+
this.like.emit(this.book());
|
17 |
+
}
|
18 |
}
|
@@ -1,8 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
<section>
|
2 |
<h1>Books</h1>
|
3 |
<div>
|
4 |
@for (b of books(); track b.isbn) {
|
5 |
-
<app-book-item [book]="b" />
|
6 |
}
|
7 |
</div>
|
8 |
</section>
|
|
|
1 |
+
<section>
|
2 |
+
<h1>Favorite Books</h1>
|
3 |
+
<button type="button" (click)="clearLikedBooks()">Clear</button>
|
4 |
+
<ul>
|
5 |
+
@for (b of likedBooks(); track b.isbn) {
|
6 |
+
<li>{{ b.title }} ({{ b.isbn }})</li>
|
7 |
+
} @empty {
|
8 |
+
<li>No books liked.</li>
|
9 |
+
}
|
10 |
+
</ul>
|
11 |
+
</section>
|
12 |
+
|
13 |
<section>
|
14 |
<h1>Books</h1>
|
15 |
<div>
|
16 |
@for (b of books(); track b.isbn) {
|
17 |
+
<app-book-item [book]="b" (like)="addLikedBook($event)" />
|
18 |
}
|
19 |
</div>
|
20 |
</section>
|
@@ -11,6 +11,7 @@ import { BookItem } from '../book-item/book-item';
|
|
11 |
})
|
12 |
export class BookList {
|
13 |
readonly books = signal<Book[]>([]);
|
|
|
14 |
|
15 |
constructor() {
|
16 |
this.books.set([
|
@@ -34,4 +35,18 @@ export class BookList {
|
|
34 |
},
|
35 |
]);
|
36 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
37 |
}
|
|
|
11 |
})
|
12 |
export class BookList {
|
13 |
readonly books = signal<Book[]>([]);
|
14 |
+
readonly likedBooks = signal<Book[]>([]);
|
15 |
|
16 |
constructor() {
|
17 |
this.books.set([
|
|
|
35 |
},
|
36 |
]);
|
37 |
}
|
38 |
+
|
39 |
+
addLikedBook(newLikedBook: Book) {
|
40 |
+
const foundBook = this.likedBooks().find(
|
41 |
+
(b) => b.isbn === newLikedBook.isbn
|
42 |
+
);
|
43 |
+
|
44 |
+
if (!foundBook) {
|
45 |
+
this.likedBooks.update((likedBooks) => [...likedBooks, newLikedBook]);
|
46 |
+
}
|
47 |
+
}
|
48 |
+
|
49 |
+
clearLikedBooks() {
|
50 |
+
this.likedBooks.set([]);
|
51 |
+
}
|
52 |
}
|