
Динамические компоненты в Angular позволяют загружать компоненты во время выполнения в тех случаях, когда во время сборки вы не знаете, какой компонент необходимо отрисовать.
Например, в обычном случае списка/элемента у вас будет ListComponent, в котором вы будете отображать ItemComponent для каждого элемента в вашем списке, используя директиву *ngFor. Это работает, если вы знаете, как должен отображаться каждый элемент в списке.
Возьмем глупый, но конкретный пример. У вас есть список домашних животных. Кто-то собаки, кто-то кошки. Кошки и собаки имеют разные атрибуты и должны рендериться по-разному, и вы, конечно, не знаете заранее, как будет выглядеть список питомцев, возвращаемый сервером. Одним из решений этой проблемы является использование динамических компонентов.
Я уже писал об этом статью в Angular 8. С тех пор процесс упростился, давайте обновим пример.
Если у вас есть кошки и собаки, реализующие общий интерфейс Pet:
export default interface Pet {
name: string;
age: number;
profilePicture?: string;
}
import Pet from './Pet';
export default interface Dog extends Pet {
favoritePark: string;
}
import Pet from './Pet';
export default interface Cat extends Pet {
favoriteComfyPlace: string;
}
возможно, вы захотите изобразить кошек с их любимым удобным местом:
<div class="card">
<img [src]="member.profilePicture || 'assets/cat.png'"/>
<div class="info">
<div class="name">{{member.name}}</div>
<div class="age">Age: {{member.age}}</div>
<div class="favorite-comfy-place">Favorite Comfy Place: {{member.favoriteComfyPlace}}</div>
</div>
</div>
а мы хотим отобразить собак с их любимым парком:
<div class="card">
<img [src]="member.profilePicture || 'assets/dog.png'" />
<div class="info">
<div class="name">{{member.name}}</div>
<div class="age">Age: {{member.age}}</div>
<div class="favorite-park">Favorite Park: {{member.favoritePark}}</div>
</div>
</div>
чтобы в итоге получить список участников, похожий на этот: