Я создаю небольшое приложение, которое показывает книги из базы данных.Мой проект выглядит так:
| presentational
| ---> book-card
| ---> book-details
| containers
| ---> book-item
| ---> books
| services
| ---> books
Я использую BookItemComponent в качестве контейнера, этот класс взаимодействует с BooksComponent.Компоненты books отображают карточку книги (как стиль начальной загрузки), компонент book-card имеет ввод (получить информацию о книге) и вывод (чтобы показать больше действий и подробностей о книге).Вот код для этих классов:
book-item.component.ts:
export class BookItemComponent implements OnInit {
book: Book; /*= {"title": "New harry", "author": "J.K Rowling"};*/
constructor(private booksService: BooksService, private route: ActivatedRoute) { }
ngOnInit() {
console.log("BookItemComponent.ngOnInit()");
this.booksService.getBooks().subscribe(
(books) => {
const param = this.route.snapshot.params.id;
console.log(param);
this.book = books.find(book => book.id == param);
});
}
}
book-item.component.html:
<p>Book-item</p>
<p *ngIf="!book">No book found..</p>
<app-book-details
[book]="book"
(addToFav)="onAddToFav(book)"></app-book-details>
Класс BookItemComponent связывается с BooksComponent, который является основным контейнером:
books.component.ts
export class BooksComponent implements OnInit {
books: Book[];
constructor(private booksService: BooksService, private router: Router) { }
ngOnInit() {
this.booksService.getBooks().subscribe(books => {
this.books = books;
});
}
onShowDetails(event: Book) {
this.router.navigate(['/', event.id]);
}
}
И наконец:
book-card.component.ts:
@Component({
selector: 'app-book-card',
templateUrl: './book-card.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
styleUrls: ['./book-card.component.css']
})
export class BookCardComponent {
@Input() book: Book;
@Output() showDetails = new EventEmitter<Book>();
showBookDetails(event: Book) {
if(event) {
this.showDetails.emit(event);
}
}
}
** ПРОБЛЕМА **: В методе BookItemComponent.ngOnInit (), когда я использую это:
this.booksService.getBooks().subscribe(
(books) => {
const param = this.route.snapshot.params.id;
this.book = books.find(book => book.id == param);
});
Я вижу, что книга не определена, посмотрите на эту картинку: