Редактор героев¶
28.02.2022
Теперь у приложения есть базовый заголовок. Далее создайте новый компонент для отображения информации о герое и поместите этот компонент в оболочку приложения.
Пример приложения, которое описывается на этой странице, см.:
Создание компонента heroes¶
Используйте ng generate
для создания нового компонента с именем heroes
.
1 |
|
ng generate
создает новый каталог src/app/heroes/
и генерирует три файла HeroesComponent
вместе с тестовым файлом.
Файл класса HeroesComponent
выглядит следующим образом:
1 2 3 4 5 6 7 8 |
|
Вы всегда импортируете символ Component
из библиотеки ядра Angular и аннотируете класс компонента с помощью @Component
.
@Component
— это функция-декоратор, которая определяет метаданные Angular для компонента.
Функция ng generate
создала три свойства метаданных:
Properties | Details |
---|---|
selector | Селектор CSS элементов компонента. |
templateUrl | Расположение файла шаблона компонента. |
styleUrls | Расположение частных стилей CSS компонента. |
Селектор CSS элемента, 'app-heroes'
, соответствует имени HTML элемента, который идентифицирует этот компонент в шаблоне родительского компонента.
Всегда export
класс компонента, чтобы вы могли import
его в другое место … например, в AppModule
.
Добавить свойство hero
¶
Добавьте свойство hero
в HeroesComponent
для героя по имени Windstorm
.
1 |
|
Показать героя¶
Откройте файл шаблона heroes.component.html
. Удалите текст по умолчанию, созданный ng generate
, и замените его привязкой данных к новому свойству hero
.
1 |
|
Показать представление HeroesComponent
¶
Чтобы отобразить HeroesComponent
, вы должны добавить его в шаблон оболочки AppComponent
.
Помните, что app-heroes
является селектором элемента для HeroesComponent
. Добавьте элемент <app-heroes>
в файл шаблона AppComponent
, чуть ниже заголовка.
1 2 |
|
Если ng serve
все еще запущен, браузер должен обновиться и отобразить заголовок приложения и имя героя.
Создание интерфейса Hero
¶
Настоящий герой — это больше, чем имя.
Создайте интерфейс Hero
в собственном файле в каталоге src/app
. Дайте ему свойства id
и name
.
1 2 3 4 |
|
Вернитесь к классу HeroesComponent
и импортируйте интерфейс Hero
.
Переделайте свойство hero
компонента так, чтобы оно имело тип Hero
. Инициализируйте его с id
равным 1
и именем Windstorm
.
Измененный файл класса HeroesComponent
должен выглядеть следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
Страница больше не отображается должным образом, потому что вы изменили героя со строки на объект.
Показать объект героя¶
Обновите привязку в шаблоне, чтобы объявить имя героя и показать и id
, и name
в подробном отображении, как показано ниже:
1 2 3 |
|
Браузер обновляется и отображает информацию о герое.
Форматирование с помощью UppercasePipe
¶
Отредактируйте привязку hero.name
следующим образом:
1 |
|
Браузер обновляется, и теперь имя героя отображается заглавными буквами.
Слово uppercase
в интерполяционной привязке после символа пайпа |
активизирует встроенную функцию UppercasePipe
.
Пайпы — это хороший способ форматирования строк, валютных сумм, дат и других отображаемых данных. В Angular поставляется несколько встроенных пайпов, и вы можете создать свой собственный.
Редактирование героя¶
Пользователи должны иметь возможность редактировать имя героя в текстовом поле <input>
.
Текстовое поле должно как отображать свойство name
героя, так и обновлять его по мере ввода пользователем. Это означает, что данные поступают из класса компонента на экран и с экрана обратно в класс.
Чтобы автоматизировать этот поток данных, установите двустороннюю привязку между элементом формы <input>
и свойством hero.name
.
Двусторонняя связь¶
Переделайте область подробностей в шаблоне HeroesComponent
так, чтобы она выглядела следующим образом:
1 2 3 4 5 6 7 8 |
|
[(ngModel)]
— это синтаксис двустороннего связывания данных Angular.
Здесь он связывает свойство hero.name
с текстовым полем HTML, чтобы данные могли поступать в обоих направлениях. Данные могут поступать из свойства hero.name
в текстовое поле и из текстового поля обратно в hero.name
.
Отсутствующий FormsModule
¶
Обратите внимание, что приложение перестало работать, когда вы добавили [(ngModel)]
.
Чтобы увидеть ошибку, откройте средства разработки браузера и найдите в консоли сообщение вида
1 2 |
|
Хотя ngModel
является действительной директивой Angular, она не доступна по умолчанию.
Она относится к дополнительному модулю FormsModule
, и вы должны оптировать ее использование.
AppModule
¶
Angular необходимо знать, как части вашего приложения сочетаются друг с другом и какие другие файлы и библиотеки требуются приложению. Эта информация называется метаданные.
Часть метаданных находится в декораторах @Component
, которые вы добавили в классы компонентов. Другие важные метаданные находятся в декораторах @NgModule
.
Самый важный декоратор @NgModule
аннотирует класс верхнего уровня AppModule.
При создании проекта ng new
создал класс AppModule
в src/app/app.module.ts
. Именно здесь вы входите в FormsModule
.
Импортируйте FormsModule
¶
Откройте app.module.ts
и импортируйте символ FormsModule
из библиотеки @angular/forms
.
1 |
|
Добавьте FormsModule
в массив imports
в @NgModule
. Массив imports
содержит список внешних модулей, которые необходимы приложению.
1 2 3 4 |
|
Когда браузер обновится, приложение должно снова работать. Вы можете отредактировать имя героя и увидеть изменения, отраженные сразу же в <h2>
над текстовым полем.
Объявление HeroesComponent
¶
Каждый компонент должен быть объявлен в только одном NgModule.
Вы не объявили HeroesComponent
. Почему приложение сработало?
Оно заработало, потому что ng generate
объявил HeroesComponent
в AppModule
, когда создавал этот компонент.
Откройте src/app/app.module.ts
и найдите импортированный HeroesComponent
в самом верху.
1 |
|
Компонент HeroesComponent
объявлен в массиве @NgModule.declarations
.
1 2 3 4 |
|
AppModule
объявляет оба компонента приложения, AppComponent
и HeroesComponent
.
Окончательный обзор кода¶
Вот файлы кода, обсуждаемые на этой странице.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
1 2 3 4 5 6 7 8 9 10 |
|
1 2 |
|
1 2 3 4 |
|
Резюме¶
- Вы использовали
ng generate
для создания второгоHeroesComponent
. - Вы отобразили
HeroesComponent
, добавив его в оболочкуAppComponent
. - Вы применили
UppercasePipe
для форматирования имени. - Вы использовали двустороннее связывание данных с помощью директивы
ngModel
. - Вы узнали о модуле
AppModule
. - Вы импортировали
FormsModule
вAppModule
, чтобы Angular распознал и применил директивуngModel
. - Вы узнали о важности объявления компонентов в
AppModule
.