Создайте компонент характеристик¶
На данный момент компонент HeroesComponent отображает как список героев, так и подробную информацию о выбранном герое.
Держать все функции в одном компоненте по мере роста приложения будет невозможно. В этом руководстве крупные компоненты разбиваются на более мелкие подкомпоненты, каждый из которых ориентирован на выполнение определенной задачи или рабочего процесса.
Первым шагом будет перемещение деталей героя в отдельный, многократно используемый HeroDetailComponent, и в итоге мы получим:
HeroesComponent, который представляет список героев.- Компонент
HeroDetailComponent, который представляет детали выбранного героя.
Пример приложения, которое описывается на этой странице, см.:
Создайте компонент HeroDetailComponent¶
Используйте эту команду ng generate для создания нового компонента с именем hero-detail.
1 | |
Команда выполняет следующее:
- Создает каталог
src/app/hero-detail.
Внутри этого каталога создаются четыре файла:
- CSS-файл для стилей компонента.
- HTML-файл для шаблона компонента.
- TypeScript-файл с классом компонента с именем
HeroDetailComponent. - Тестовый файл для класса
HeroDetailComponent.
Команда также добавляет HeroDetailComponent в качестве объявления в декораторе @NgModule файла src/app/app.module.ts.
Написать шаблон¶
Вырежьте HTML для детализации героя из нижней части шаблона HeroesComponent и вставьте его поверх содержимого шаблона в шаблоне HeroDetailComponent.
Вставленный HTML ссылается на selectedHero. Новый HeroDetailComponent может представлять любого героя, а не только выбранного.
Замените selectedHero на hero везде в шаблоне.
Когда вы закончите, шаблон HeroDetailComponent должен выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 | |
Добавьте свойство @Input() героя¶
Шаблон HeroDetailComponent привязывается к свойству hero компонента, которое имеет тип Hero.
Откройте файл класса HeroDetailComponent и импортируйте символ Hero.
1 | |
Свойство hero должно быть свойством Input, аннотированным с помощью декоратора @Input(), поскольку внешний HeroesComponent привязывается к нему следующим образом.
1 | |
Измените оператор импорта @angular/core, чтобы включить символ Input.
1 | |
Добавьте свойство hero, которому предшествует декоратор @Input().
1 | |
Это единственное изменение, которое вы должны внести в класс HeroDetailComponent. Больше нет никаких свойств. Нет никакой логики представления.
Этот компонент только получает объект героя через свойство hero и отображает его.
Показать HeroDetailComponent¶
Компонент HeroesComponent использовался для самостоятельного отображения деталей героя, до того как вы удалили эту часть шаблона. Этот раздел поможет вам делегировать логику компоненту HeroDetailComponent.
Эти два компонента находятся в отношениях родитель/потомок. Родительский компонент, HeroesComponent, управляет дочерним компонентом HeroDetailComponent путем
посылая ему нового героя для отображения всякий раз, когда пользователь выбирает героя из списка.
Вам не нужно изменять класс HeroesComponent, вместо этого измените его шаблон.
Обновите шаблон HeroesComponent¶
Селектором HeroDetailComponent является 'app-hero-detail'. Добавьте элемент <app-hero-detail> в нижней части шаблона HeroesComponent, там, где раньше находилось детальное представление героя.
Привяжите HeroesComponent.selectedHero к свойству hero элемента следующим образом.
1 | |
[hero]="selectedHero" — это привязка свойства Angular.
Это односторонняя привязка данных от свойства selectedHero компонента HeroesComponent к свойству hero целевого элемента, которое отображается на свойство hero компонента HeroDetailComponent.
Теперь, когда пользователь нажимает на героя в списке, selectedHero изменяется. Когда selectedHero изменяется, привязка свойств обновляет hero и
компонент HeroDetailComponent отображает нового героя.
Переработанный шаблон HeroesComponent должен выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Браузер обновляется, и приложение начинает работать, как и раньше.
Что изменилось?¶
Как и ранее, когда пользователь нажимает на имя героя, подробная информация о герое появляется под списком героев.
Теперь HeroDetailComponent представляет эти детали вместо HeroesComponent.
Рефакторинг оригинального HeroesComponent на два компонента дает преимущества, как сейчас, так и в будущем:
- Вы сократили обязанности
HeroesComponent. - Вы можете развивать
HeroDetailComponentв богатый редактор героев не трогая родительскийHeroesComponent. - Вы можете развивать
HeroesComponent, не трогая детальное представление героя. - Вы можете повторно использовать
HeroDetailComponentв шаблоне будущего компонента.
Окончательный обзор кода¶
Вот файлы кода, рассмотренные на этой странице.
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Резюме¶
- Вы создали отдельный, многократно используемый
HeroDetailComponent. - Вы использовали связывание свойств, чтобы дать родительскому
HeroesComponentконтроль над дочернимHeroDetailComponent. - Вы использовали декоратор
@Input
чтобы сделать свойство hero доступным для привязки внешним HeroesComponent.