Взаимодействие компонентов¶
Для передачи данных из одного Angular компонента в другой существует несколько способов:
@Input()
свойства;@Output()
свойства;@ViewChild()
свойства;- Сервис.
Первые три случая были рассмотрены ранее в предыдущих главах. Тем не менее в этой главе приведены примеры всех способов взаимодействия.
Пример Angular компонента с @Input()
, @Output()
и @ViewChild()
приведен ниже.
parent-example.component.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
child-example.component.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
Декоратор @Input()
позволяет передавать значения дочерним компонентам, но только на один уровень иерархии.
С помощью @Output()
имитируют возникновение события и передают данные родительскому компоненту.
Использование @ViewChild()
в родительском Angular component позволяет получить все свойства указанного дочернего компонента.
Полное описание указанных декораторов находится в главах "Компоненты", "Обработка событий" и "Жизненный цикл компонента" соответственно.
Еще один способ передавать данные между компонентами — использование сервисов. Сервис — одна из сущностей Angular, которая реализует паттерн проектирования Singleton и служит хранилищем данных. Другое частое его использование — хранение методов, осуществляющих HTTP запросы к серверу.
Обычно сервис определяется на уровне всего приложения в целом. Поэтому все Angular компоненты обращаются к одному и тому же его экземпляру. Более подробно здесь.
Перед использованием сервисы необходимо импортировать в корневой модуль.
1 2 3 4 5 6 7 8 |
|
Пример Angular компонента с сервисом.
some-data.service.ts
1 2 3 4 |
|
first.component.ts
1 2 3 4 5 6 7 8 9 10 |
|
second.component.ts
1 2 3 4 5 6 7 8 9 |
|
В сервисе SomeDataService
определено свойство data
со значением 1
. В FirstComponent
в консоль выводится значение data
и затем ему же присваивается новое значение — 3
.
Далее уже в конструкторе SecondComponent
выводится свойство data
сервиса SomeDataService
. Как можно убедиться, в консоль будет выведено 3
. Все потому что оба Angular компонента обращаются к одному и тому же экземпляру класса сервиса.