Наблюдаемые значения в Angular¶
28.02.2022
Angular использует наблюдаемые значения в качестве интерфейса для обработки множества распространенных асинхронных операций. Например:
- Модуль HTTP использует наблюдаемые значения для обработки AJAX-запросов и ответов
- Модули Router и Forms используют наблюдаемые значения для прослушивания и реагирования на события, связанные с вводом данных пользователем
Передача данных между компонентами¶
Angular предоставляет класс EventEmitter
, который используется при публикации значений из компонента через декоратор @Output()
. EventEmitter
расширяет RxJS Subject
, добавляя метод emit()
, чтобы можно было отправлять произвольные значения. Когда вы вызываете emit()
, он передает переданное значение методу next()
любого подписанного наблюдателя.
Хороший пример использования можно найти в документации EventEmitter. Здесь приведен пример компонента, который прослушивает события открытия и закрытия:
1 |
|
Вот определение компонента:
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 |
|
HTTP¶
Angular HttpClient
возвращает наблюдаемые значения из вызовов HTTP-методов. Например, http.get('/api')
возвращает наблюдаемое значение. Это дает ряд преимуществ по сравнению с HTTP API, основанными на промисах:
-
Наблюдаемые значения не изменяют ответ сервера (как это может происходить при цепочке вызовов
.then()
на промисах).Вместо этого можно использовать ряд операторов для преобразования значений по мере необходимости.
-
HTTP-запросы можно отменить с помощью метода
unsubscribe()
. - Запросы могут быть настроены на получение обновлений о событиях выполнения
- Неудачные запросы могут быть легко повторены
Асинхронный пайп¶
AsyncPipe подписывается на наблюдаемое значение или промис и возвращает последнее выданное им значение. Когда выдается новое значение, пайп помечает компонент для проверки на изменения.
В следующем примере наблюдаемое значение time
привязывается к представлению компонента. Наблюдаемое значение постоянно обновляет представление текущим временем.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Router¶
Router.events
предоставляет события в виде наблюдаемых значений. Вы можете использовать оператор filter()
из RxJS для поиска интересующих вас событий и подписки на них, чтобы принимать решения, основанные на последовательности событий в процессе навигации. Приведем пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
ActivatedRoute — это инжектируемый сервис маршрутизатора, использующий наблюдаемые значения для получения информации о пути маршрута и параметрах. Например, ActivatedRoute.url
содержит наблюдаемое значение, сообщающее о пути или путях маршрута. Вот пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
Реактивные формы¶
Реактивные формы имеют свойства, использующие наблюдаемые значения для отслеживания значений элементов управления формой. Свойства FormControl
valueChanges
и statusChanges
содержат наблюдаемые значения, вызывающие события изменения. Подписка на наблюдаемое значение свойства элемента управления формой позволяет задействовать прикладную логику в классе компонента. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|