Работа с компонентами¶
Кроме основных компонентов в приложении, мы также можем определять какие-то вспомогательные компоненты, которые управляют каким-то участком разметки html. Более того в приложении на странице может быть ряд разных блоков с какой-то определенной задачей. И для каждого такого блока можно создать отдельный компонент, чтобы упростить управление блоками на странице.
Добавим в проект второй компонент. Для этого добавим в папку src/app
новый файл child.component.ts
. В итоге весь проект будет выглядеть следующим образом:
Определим в файле child.component.ts
следующий код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
Здесь определен класс ChildComponent
. Опять же чтобы сделать этот класс компонентом, необходимо применить декоратор @Component
.
Компонент будет управлять разметкой html, которая будет вставляться в элемент child-comp
.
Шаблон представления будет просто выводить заголовок. В заголовке выводится имя, заданное через переменную name
.
И кроме того, здесь определены стили для элементов h2
и p
.
Теперь изменим код компонента AppComponent
в файле app.component.ts
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Это основной компонент, который будет запускаться при загрузке приложения, и через него мы будем использовать остальные компоненты. Так, компонент ChildComponent
будет загружаться в элемент child-comp
. И в шаблоне компонента AppComponent
как раз определен такой элемент.
Кроме того, компонент определяет стили для тех же элементов на странице, и также, как и ChildComponent
, определяет свойство name
, только с другим значением.
Чтобы использовать все определенные в проекте компоненты, они должны быть указаны в главном модуле приложения. Определим в файле app.module.ts
следующий модуль:
1 2 3 4 5 6 7 8 9 10 11 |
|
Запустим проект:
Результат показывает, что несмотря на то, что один компонент как бы включен в другой с помощью тега <child-comp>
, но тем не менее стили одного компонента не применяются к другому. Каждый компонент очерчивает свою область с помощью шаблона, свое представление, которым он и управляет.
Также каждый компонент использует свое значение свойства name
. То есть компоненты фактически существуют относительно независимо.
Даже если мы уберем из ChildComponent
определение свойства name
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
То родительский или главный компонент, все равно не окажет влияния на ChildComponent
:
Хотя может показаться, что ChildComponent
для выражения {{name}}
в своем шаблоне должен использовать свойство name
из родительского компонента AppComponent
. Но это не так. Компоненты относительно независимы друг от друга.
ng-content¶
Элемент ng-content
позволяет внедрять родительским компонентам код html в дочерние компоненты. Так, изменим компонент ChildComponent
следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Вместо элемента <ng-content>
извне можно будет передать любое содержимое.
И изменим код главного компонента AppComponent:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
В элемент <child-comp>
здесь передается заголовок <h2>Добро пожаловать {{name}}!</h2>
. Затем этот заголовок будет вставляться в дочерний компонент ChildComponent
на место <ng-content>
:
Причем управлять разметкой, которая вставляется в <ng-content>
, будет AppComponent
. Поэтому именно этот компонент задает стили и выражения привязки для вставляемого куска html.