add first draft of search bar to comics list
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
|
<div>
|
||||||
|
<input #searchQuery type="text" (input)="search($event.target.value)" placeholder="Search" />
|
||||||
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
@for (comic of comics(); track comic.id) {
|
@for (comic of comics(); track comic.id) {
|
||||||
<li>
|
<li>
|
||||||
|
|||||||
+16
-7
@@ -1,16 +1,21 @@
|
|||||||
import { Component, DestroyRef, inject, OnInit, signal } from '@angular/core';
|
import { Component, computed, DestroyRef, inject, OnInit, signal } from '@angular/core';
|
||||||
import { Comic } from '../comic.model';
|
import { Comic } from '../comic.model';
|
||||||
import { ComicService } from '../comic-comics/comic.service';
|
import { ComicService } from '../comic-comics/comic.service';
|
||||||
import { ComicComicComponent } from "../comic-comic/comic-comic.component";
|
import { ComicComicComponent } from '../comic-comic/comic-comic.component';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-comic-comics-list',
|
selector: 'app-comic-comics-list',
|
||||||
imports: [ComicComicComponent],
|
imports: [ComicComicComponent],
|
||||||
templateUrl: './comic-comics-list.component.html',
|
templateUrl: './comic-comics-list.component.html',
|
||||||
styleUrl: './comic-comics-list.component.css'
|
styleUrl: './comic-comics-list.component.css',
|
||||||
})
|
})
|
||||||
export class ComicComicsListComponent implements OnInit {
|
export class ComicComicsListComponent implements OnInit {
|
||||||
comics = signal<Comic[] | undefined>(undefined);
|
comicsFetched = signal<Comic[] | undefined>(undefined);
|
||||||
|
searchQuery = signal<string>('');
|
||||||
|
comics = computed(() => {
|
||||||
|
const sq = this.searchQuery();
|
||||||
|
return this.comicsFetched()?.filter(c => c.title.toLowerCase().includes(sq.toLowerCase()));
|
||||||
|
});
|
||||||
isFetching = signal(false);
|
isFetching = signal(false);
|
||||||
error = signal('');
|
error = signal('');
|
||||||
private comicsService = inject(ComicService);
|
private comicsService = inject(ComicService);
|
||||||
@@ -20,18 +25,22 @@ export class ComicComicsListComponent implements OnInit {
|
|||||||
this.isFetching.set(true);
|
this.isFetching.set(true);
|
||||||
const subscription = this.comicsService.loadComics().subscribe({
|
const subscription = this.comicsService.loadComics().subscribe({
|
||||||
next: (comics) => {
|
next: (comics) => {
|
||||||
this.comics.set(comics);
|
this.comicsFetched.set(comics);
|
||||||
},
|
},
|
||||||
error: (error: Error) => {
|
error: (error: Error) => {
|
||||||
this.error.set(error.message);
|
this.error.set(error.message);
|
||||||
},
|
},
|
||||||
complete: () => {
|
complete: () => {
|
||||||
this.isFetching.set(false);
|
this.isFetching.set(false);
|
||||||
}
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
this.destroyRef.onDestroy(() => {
|
this.destroyRef.onDestroy(() => {
|
||||||
subscription.unsubscribe();
|
subscription.unsubscribe();
|
||||||
})
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
search(query: string) {
|
||||||
|
this.searchQuery.set(query);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user